Обработка исключений Java - PullRequest
1 голос
/ 03 мая 2011

У меня есть следующий код.При этом fn2 фактически выдает исключение, и оно попадает в саму функцию.В функции fn1 компилятор жалуется на необработанное исключение, поскольку объявлено, что fn2 вызывает исключение.

Почему это так?Поскольку исключение зафиксировано внутри fn2, не должно жаловаться, верно?

Пожалуйста, объясните поведение.

public class ExepTest {

/**
 * @param args
 */
public static void main(String[] args) {

    ExepTest exT = new ExepTest();
    exT.fn1();

}
public void fn1(){
    fn2();//compilation error
}
public void fn2() throws Exception{

    try{
        throw new Exception();
    }
    catch(Exception ex){
        System.out.println("Exception caught");
    }
}
}

Ответы [ 7 ]

10 голосов
/ 03 мая 2011

Компилятор не знает / не может знать, что во время выполнения никакое исключение не будет выдано fn2(), поскольку объявлено, что оно может вызвать исключение, поэтому вы получили ошибку.

3 голосов
/ 03 мая 2011

Удалить throws Exception из fn2() подписи

1 голос
/ 03 мая 2011
public void fn1(){
    fn2();//compilation error
}
public void fn2() throws Exception{

    try{
        throw new Exception();
    }
    catch(Exception ex){
        System.out.println("Exception caught");
    }
}
}

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

Чтобы запустить программу, либо удалите throws Exception из fn2 , либо запишите throws Exception в fn1 или обработайте его в try..catch в fn1 .

1 голос
/ 03 мая 2011

Вам необходимо заключить вызов к fn2() в блок try-catch или объявить, что fn1 также вызывает исключение.

1 голос
/ 03 мая 2011

Исключение выдается fn2, а не внутри него.Так что он будет на самом деле брошен туда, где он называется.Поскольку он вызывается в fn1, он ведет себя следующим образом.

1 голос
/ 03 мая 2011

public void fn2() throws Exception. Компилятор увидит эту декларацию и ожидает, что каждый вызывающий объект fn2 обработает / сбросит исключение.

1 голос
/ 03 мая 2011

Подпись метода fn2 - это все, что здесь имеет значение. В этой подписи вы заявляете, что fn2 может выдать исключение. Любой код, вызывающий метод, который может вызвать исключение, должен обрабатывать исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...