dimaMJ
25 уровень

Цикл для try-catch

Статья из группы Архив info.javarush
участников
Программа простая, пользователь вводит имя файла, если такой файл есть то считывается и т.д., если нет то срабатывает исключение и пользователь должен ввести снова имя файла и так до тех пор пока имя файла не будет правильным. Вот код : public class Solution { public static void main(String[] args) throws Exception { InputStream inStream = filego(); OutputStream outStream = new PrintStream(System.out); while(inStream.available()>0) { int data = inStream.read(); outStream.write(data); } inStream.close(); outStream.close(); } public static InputStream filego() throws Exception { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String FileName = reader.readLine(); InputStream inStream = null ; try { inStream = new FileInputStream(FileName); } catch (Exception e) { System.out.println("Файл не найден, введите еще раз"); filego(); } return inStream; } } При запуске программы, когда ввожу не правильное имя все работает, когда ввожу правильное выдает Exception in thread "main" java.lang.NullPointerException то есть возвращает почему то null, что я не так делаю, может глаза запотели или что то не понимаю, подскажите пожалуйста ) Очень хочу разобраться, как правильно сделать цикл для try-catch. Пробовал без отдельного метода, просто через while,тоже ничего хорошего не вышло )
И правильно ли я указал тип возвращаемого значения ?
Комментарии (7)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
dimaMJ
Уровень 25
27 августа 2014, 09:04
с рекурсией еще не очень знаком) спасибо за ответы, разобрался)
Ruzveld
Уровень 34
26 августа 2014, 22:11
Не думаю, что рекурсия для такой задачи — правильный выбор. К тому же, результат рекурсивного вызова filego() у тебя просто игнорируется, соответственно, если в первой попытке вылетело исключение, то в любом случае в main вернется null.
dimaMJ
Уровень 25
26 августа 2014, 20:40
никто не поможет ?)
Sultan
Уровень 16
26 августа 2014, 22:49
смотри, если при первом вызове указан неверный адрес файла, то после всех рекурсивных вызовов первая вызванная функция filego вернет null, и именно значение первой вызванной функции будет присвоено в строчке InputStream inStream = filego();
Sultan
Уровень 16
26 августа 2014, 22:53
это решается всего лишь одним дополнительным словом:
try {
    inStream = new FileInputStream(FileName);
} catch(Exception e) {
    System.out.println("Файл не найден, введите еще раз");
    return fileGo(); // !!!
}
Sultan
Уровень 16
26 августа 2014, 22:58
Лучше так:
public static InputStream fileGo() throws Exception {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    String fileName;
    InputStream inStream = null;

    while (inStream == null) {
        try {
            fileName = reader.readLine();
            inStream = new FileInputStream(fileName);
        } catch(Exception e) {
            System.out.println("Файл не найден, введите еще раз");
        }
    }

    return inStream;
}
Sultan
Уровень 16
26 августа 2014, 23:04
public class Main {

    public static void main(String[] args)  {
        InputStream inStream = fileGo();
        OutputStream outStream = new PrintStream(System.out);

        try {
            while (inStream.available() > 0) {
                int data = inStream.read();
                outStream.write(data);
            }

            inStream.close();
            outStream.close();
        } catch(IOException e) {
            e.printStackTrace();
        }
    }

    public static InputStream fileGo() {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String fileName;

        while (true) {
            try {
                fileName = reader.readLine();
                return new FileInputStream(fileName);
            } catch(FileNotFoundException e) {
                System.out.println("Файл не найден, введите еще раз");
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
    }

}