java 异常处理机制

这里写图片描述

Error 和Excetion 都是继承于Throwable

Error

是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。

Exception

CheckedException 普通异常 (可检查)

是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。

RuntimeException 运行时异常 (不可检查异常)

都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

最常见的RuntimeException

NullPointerException 空指针异常

ClassNotFoundException 指定的类未找到

NumberFormatException 字符串转换数字异常

IndexOutOfBoundsException 数组角标越界

IllegalArgumentException 方法传递参数错误

ClassCastException 数据类型转换异常

NoClassDefFoundException 未找到类定义错误

SQLException SQL 数据库操作错误

InstantiationException 实例化异常

NoSuchMethodException 方法不存在异常

throw 和 throws的区别

throw

1.用在方法体内,表示抛出异常.

...
throw new Exception("测试出错了!");
...

2.throw是具体向外抛出异常的动作,所以他抛出的是一个异常实例,并且肯定抛出了某种异常

throws

1.throws用在方法声明后面,表示如果抛出异常,由该方法的调用者进行异常的处理.
2.throws主要是声明这个方法会抛出某种类型 的异常,让它使用者知道需捕获主要是声明这个方法会抛出某种类型 的异常.
3.throws 表示出现异常的一种可能性,并不一定会发生这种异常.

catch finally执行原则

例子

public class ExceptionTest {
    public static void main(String[] args) {
        System.out.println(getNum());
    }

    public static int getNum() {
        try {
            int a = 1 / 0;
            return 1;
        } catch (Exception e) {
            System.out.println("catch is called "+e.toString());
            return 2;
        } finally {
            System.out.println("finally is called");
            return 3;
        }
    }
}

执行结果

catch is called java.lang.ArithmeticException: / by zero
finally is called
3

原则: catch 遇到 return 或者 异常使得该函数终止的话,有finally就必须执行 finally 代码再返回值;但是finally里面有return 语句,这个时候方法就结束了,因此返回结果是3;如果finally只是资源释放的话 ,最终结果就是2。

猜你喜欢

转载自blog.csdn.net/QG_zhang/article/details/80633403