Java异常详细解析及分类处理

异常哪些类型

RuntimeException(unchecked exception):

编译时,不会提示和发现这样的异常,不要求立刻处理这些异常。所以我们可以使用try…catch…finally处理异常,也可以不处理。
对于这些异常,应该修正,而不是去通过异常处理器处理 。这样的异常发生的原因多半是代码写的有问题。

Exception(checked exception):

强制要求处理,使用try…catch…finally或者throws。

异常怎样产生

unchecked Exception

如除0错误ArithmeticException,错误的强制类型转换错误ClassCastException,数组索引越界ArrayIndexOutOfBoundsException,使用了空对象NullPointerException等等

public class Test13 {
    public static void main(String[] args) {
        //unchecked Exception调用不会出现异常
        method();
    }

    private static void method() {
        int a = 10;
        int b = 0;
        try {
            //发生异常, ArithmeticException extends RuntimeException
            //可以不处理但是运行时会报异常,也可以用try catch处理.
            System.out.println(a / b);
        } catch (ArithmeticException e) {
            e.printStackTrace();
        }
        //try catch后面的代码可以运行
        System.out.println("mark");
    }
}

checked Exception

除了error和RuntimeException之外的异常

throw

主动抛出异常.
用在方法体内, 后面跟异常对象(Exception or RuntimeException…, new MyException (? extends exception or RuntimeException)), 可以是java提供的异常, 也可以是自定义继承自Exception或者RuntimeException, 但只能抛一个异常.
throw仅仅代表这里抛出了一个异常. 然后再根据这个异常的类型进行对应的处理.

class Student {
	private int score;
    
/*主动抛出编译异常,ExceptionScore extends Exception.
要么在这里try catch,要么throws给调用者,由调用者try catch或抛出.*/
    void setScore(int score) {
        if (score > 100 || score < 0) {
            try {}
                throw new ExceptionScore("分数在0-100之间");
                } catch (ExceptionScore exceptionScore) {
                    exceptionScore.printStackTrace();
                }
        } else {
            this.score = score;
        }
	}
}

异常如何处理

throws

用在方法声明后面, 可以跟单个和多个异常名,逗号隔开. 表示抛出异常, 后续程序无法运行. 由调用者来处理, try…catch…或者throws给JVM.
throws仅仅表示有可能抛出异常, 异常不一定发生.

try…catch…finally

用在方法中, 将异常division包裹, 范围越小越好. 可以同时catch多个异常. 后面的语句可以接着走完.

选择: 异常自己能处理就try catch, 如果不能处理就用throws; main中一般用try catch.

猜你喜欢

转载自blog.csdn.net/weixin_42098099/article/details/84754197
今日推荐