Области Java try-catch-finally, определяющие, используется ли переменная - PullRequest
1 голос
/ 17 января 2012

У меня есть следующий код:

    try {
        reader = new BufferedReader(new FileReader(file));
        String records = "";
        System.out.println("EMITTER QUEUE BACKUP: restoring from file...");
        try {
            while(reader.ready()) {
                records += reader.readLine();
            }
        } catch (IOException e) {
            System.out.println("EMITTER QUEUE BACKUP: error restoring");
            e.printStackTrace();
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {
        doSomethingWith(records);
        try {
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Переменная records в строке doSomethingWith(records); вызывает ошибку как неопределенную.Это нормально, я могу понять, что его определение в первом блоке try иногда может не происходить.Но есть вопрос: если я удаляю строку doSomethingWith(records);, то переменная records в первом блоке try помечается как неиспользуемая !!!Так почему же он распознает его как используемый в этой строке, даже если он вызывает явную ошибку, потому что предполагается, что это не та же самая переменная, и, следовательно, он не может стоять за случай использования String records = ""?

Если это имеет значение, моя IDE - Eclipse.

Ответы [ 4 ]

2 голосов
/ 17 января 2012

Дело не только в том, что определение может не произойти, объявление переменной выходит за рамки блока finally.Если это объявлено вне попытки, это остановит ошибку.

Что касается того, почему eclipse не утверждает, что он не используется, когда присутствует ошибка, я предполагаю, что ошибка скрывает предупреждение?Он никогда не доходит до стадии предупреждения, так как ошибка возникает первой в процессе компиляции?

1 голос
/ 17 января 2012

{ и } определяют область действия для конструкции в Java.

records область действия переменной ограничена конечной скобкой конструкцией try, и вы пытаетесь использовать ее снаружи, то есть в блоке finally.и именно поэтому вы получаете ошибку.

строка вызывает ошибку как неопределенную.Это нормально, я могу понять, что его определение в первом блоке try иногда может не происходить.

На самом деле это не причина.но оно реализуется в области видимости переменной.

, если я удалю doSomethingWith (records);Затем строка записи в первом блоке try помечается как неиспользуемая !!!

Назначение переменной в Java не считается ее использованием.

И ошибка предпочтительнеепредупреждение о превышении.

0 голосов
/ 17 января 2012

Вы можете инициализировать записи до начала попытки, я полагаю, потому что вы делаете пустую строку.""

0 голосов
/ 17 января 2012

records назначается внутри блока try, но никогда не читается. Назначение переменной без чтения результата бесполезно.

...