Моя программа выводит предупреждение из-за IOException? - PullRequest
0 голосов
/ 01 декабря 2018

Как вы исправите это предупреждение: недостижимое условие catch?Я видел, как люди ловят IOException после FileNotFound, и я не знаю, в чем проблема.

public void run () {

    int count = 0; 

    try {

        Scanner scan = new Scanner(new FileInputStream(file));
        while(scan.hasNext()) {
            scan.next();
            count++;

        }
    } catch(FileNotFoundException exception) {
        System.out.println(file + " not found"); 

    } catch(IOException exception) {
        exception.printStackTrace();
    }

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Единственное исключение, выброшенное из вашего кода, которое относится к семейству исключений IOException, это FileNotFoundException.Поскольку у вас уже есть блок catch для него (в частности), блок catch IOException становится избыточным.

В других случаях они могут делать что-то еще в try-catch, что также вызывает другое исключениев семействе IOException (или, может быть, выбрасывает IOException), так что ловить IOException имеет смысл.Например, рассмотрим этот код:

FileInputStream fis = new FileInputStream(file);
fis.read();

Если вы поместите это в блок try-catch, вы можете перехватить и FileNotFoundException, и IOException, и предупреждений не будет.Вторая строка выдает IOException напрямую.

Как можно видеть здесь , Сканер проглатывает любые IOException s, выбрасываемые базовым потоком во время чтения.Если вы обеспокоены решением проблем с чтением файла, у вас есть два варианта:

a) Не используйте Scanner, но вместо этого используйте API более низкого уровня, например Reader или InputStream.

b) Как только ваш цикл while завершится, сделайте это (хотя это очень необычно):

if (scan.ioException() != null) { 
    throw scan.ioException(); 
}
0 голосов
/ 01 декабря 2018

Вы можете избавиться от кода

} catch(IOException exception) {
    exception.printStackTrace();
}

, поскольку единственное исключение, которое выдается в вашем блоке try, это FileNotFoundException и его подкласс IOException.Чтобы отследить исключение, этого должно быть достаточно:

catch(FileNotFoundException exception) {
    System.out.println("" + " not found");
    exception.printStackTrace();
}
...