Стоит ли пытаться всегда следовать за уловом? - PullRequest
0 голосов
/ 06 февраля 2012
static void test() {
    try {
        System.out.print(x.toString() + " ");
    }
    finally { System.out.print("finally "); }
}

public static void main(String args[])
{
    try 
    {
        test(); 
    }
    catch (Exception ex) { System.out.print("exception "); 
}

Вывод finally exception.

Почему во время компиляции не выдается ошибка, хотя try не сопровождается catch в test()?

Ответы [ 7 ]

9 голосов
/ 06 февраля 2012

Java 7 добавить ARM (автоматическое управление ресурсами) означает, что вы можете использовать try в одиночку.

try (PrintWriter pw = new PrintWriter("out.txt")) {
    pw.println("Hello World!");
}

Закрывается pw при выходе из этой области.

6 голосов
/ 06 февраля 2012

Java-версии до версии 7 допускают следующие три комбинации try-catch-finally:

try - catch
try - catch - finally
try - finally

Исключение, вероятно, составляет NullPointerException, поскольку x не объявлено как статическое поле и инициализировановстроенный или в методе main.Блок finally всегда будет выполняться независимо от того, что происходит в блоке try или / и catch.

3 голосов
/ 06 февраля 2012

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

См .: Оператор try в спецификации языка Java.

1 голос
/ 06 февраля 2012

try должен сопровождаться перехватом ИЛИ блок finally в Java.

улов не нужен, если, наконец, есть.

1 голос
/ 06 февраля 2012

Try не обязательно нуждается в предложении catch.

Ниже приведены допустимые условия обработки исключений в Java:

  • try-catch пункт,
  • try-finally пункт или
  • try-catch-finally пункт.

Проверьте JLS Глава 11.3, Обработка исключений .

0 голосов
/ 06 февраля 2012

Вы действительно ответили на свой вопрос.Нет ошибки времени компиляции, потому что блок try не должен сопровождаться перехватом.Это семантически правильно, и часто необходимо просто хотеть блока finally после попытки.

Возможно, исключение выдается из метода, но вы все равно хотите закрыть соединение.

Например:

public void connect() throws IOException {
    Socket s = new Socket();
    try {
        s.getInputStream();         
    }
    finally {
        s.close();
    }
}
0 голосов
/ 06 февраля 2012

try должно следовать либо catch или finally.нет необходимости в catch блоке всегда.Без catch или finally произойдет ошибка времени компиляции

...