如何使用抛出来处理运行时错误

时间:2019-01-30 16:09:56

标签: java exception-handling try-catch runtimeexception throws

在以下代码段中,某些情况下进程无法处理NullPointerExceptionIllegalStateException。即在输入值为val=-4val=-2的情况下。

我读到,方法签名后添加throws会有所帮助。但是,如果我传递上述值,代码仍会中止。

public class Test extends Throwable{
    public static void processA(int val ) throws NullPointerException, IllegalStateException{
        try{
            System.out.println("1");
            processB(val);
        }catch(ArithmeticException e){
            System.out.println("2");
        }
        System.out.println("3");
    }
    public static void processB(int val) throws NullPointerException, IllegalStateException{
        try{
            System.out.println("4");
            processC(val);
        }catch(NullPointerException e){
            System.out.println("5");
            processC(val+4);
        }finally{
            System.out.println("6");
        }
        System.out.println("7");
    }
    public  static void processC(int val)throws NullPointerException, IllegalStateException, ArithmeticException{
        System.out.println("8");
        if(val<1) throw new NullPointerException();
        if(val==1) throw new ArithmeticException();
        if(val>1) throw new IllegalStateException();
        System.out.println("9");
    }

    public static void main(String[] args) throws Exception {
         processA(1); //processA(-2) or processA(-4)
    }

}

2 个答案:

答案 0 :(得分:1)

之所以中断,是因为将NullPointerExceptionIllegalStateException扔到processA(...)时您没有处理该方案。您只能处理 ArithmeticException

在代码中添加以下内容,从而如果抛出三个异常中的任何一个,则由方法processA处理。

public static void processA(int val) throws NullPointerException, IllegalStateException {
    try {
        System.out.println("1");
        processB(val);
    } catch (ArithmeticException e) {
        System.out.println("11");
    } catch (NullPointerException e) {
        System.out.println("12");
    } catch (IllegalStateException e) {
        System.out.println("13");
    }
    System.out.println("3");
}

如果您希望调用者处理它们,则需要通过 caller 方法执行相同的操作。例如:

public static void main(String[] args) {
    try {
        processA(12);
    } catch (ArithmeticException | NullPointerException | IllegalStateException e) {
        // do something here
    } 
}

在评论中回答您的问题:“但是我为什么要使用它?”

这将表明调用方将需要处理该方法引发的异常。现在,调用者可以通过try-catch块来处理它,也可以将异常重新引发给调用者。编译器还会给您一个错误,指出应该处理该异常,但这仅对 checked 异常会发生。您抛出的是未经检查的异常。这意味着在您的情况下,您几乎可以从方法声明中忽略它们。

答案 1 :(得分:1)

我建议您也考虑使用Thread.UncaughtExceptionHandler,以确保您正确处理未正确捕获的异常。

缺少异常处理是很常见的情况,使用此API可以轻松避免。

参考文献: