Вложенный блок Try-Catch, исключение не перехватывающее - PullRequest
0 голосов
/ 09 октября 2019

Моя программа пытается сканировать мой каталог в поисках файлов .cmp или .txt.

Если бы fileName равнялся "test", и если бы не было ни файлов test.cmp, ни test.txt, моя программа по-прежнему генерировала бы исключение FileNotFoundException, несмотря на мой блок try-catch при первом перехвате. Я попытался переместить второй блок try-catch, но, похоже, ничего не работает - все, что я тестирую в коде с файлом, который не существует, все равно приводит к исключению.

public int checkFileExistence() {
        BufferedReader br = null;
        int whichFileExists = 0;


        try {//check to see if a .cmp exists
            br = new BufferedReader(new FileReader(fileName + ".cmp")); 
            whichFileExists = 0;// a .cmp exists
        }

        catch (IOException e){ //runs if a .cmp file has not been found
            try {//check to see if a .txt file exists
                br = new BufferedReader(new FileReader(fileName + ".txt"));
                whichFileExists = 1;//a .txt file exists
            }
            catch (IOException e2) {//if no .txt (and .cmp) file was found  

                e2.printStackTrace();
                whichFileExists = 2; //no file exists

            }

        }

        finally {   

            try {
                br.close();
            } 

            catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }


        return whichFileExists;
    }


Я ожидаю, что программа будет работать, но каждый раз, когда я тестирую программу, программа выдает исключение FileNotFoundException, в котором говорится, что «test.txt» не существует.

Ответы [ 2 ]

4 голосов
/ 09 октября 2019

Это исключение печатается из-за этой строки:

e2.printStackTrace();

Это работает так, как вы ожидаете, просто печатая полученную ошибку. Вы можете удалить эти printStackTrace() звонки, если не хотите их видеть. Что ж, не удаляйте тот, что находится в последнем блоке перехвата, иначе вы никогда не узнаете, есть ли там проблема.

В отдельном примечании этот дизайн полностью основан на исключениях, что не рекомендуется. Я уверен В классе File есть методы для проверки существования файлов.

1 голос
/ 09 октября 2019

Эта программа работает должным образом ...

catch (IOException e2) {//if no .txt (and .cmp) file was found  

    e2.printStackTrace();
    whichFileExists = 2; //no file exists

}

Вышеупомянутое предложение catch ловит ваше IOException и печатает его с e2.printStackTrace();

...