java异常

下面是算术异常。

抛出的异常其实是个类。
下面是空指针异常。

用异常时,下面语句不会执行。

上面这些是运行时异常
下面这是编译时异常。

在程序编译期间发生的异常,称为编译时异常,也称为受检查异常
- 如何抛出异常
代码触发异常和手动发出异常。
下面是手动触发异常。

异常的捕获
异常的捕获,也就是异常的具体处理方式,主要有两种:异常声明throws 以及 try-catch捕获处理。

下面throws后加的意思是告诉编译器这里可能会有异常
main中的test也需要事先声明异常。
声明异常后出现异常依然会报错,而且报错后语句不会执行。

可以用逗号声明多个异常。非受查异常也可以声明。

可以使用try catch处理异常。
下面这个可以打印错误信息。

受查异常,没有捕获到就会报错。
异常后直接进入catch,不打印sd。

两行异常可以这样放到一行。
下面这里用了Exception后,NULL会报错,因为Expection继承了所有异常,能捕获任何异常,把它放到第一个,那么后续异常没有任何问题了。

try中存在多个异常时,捕获第一个异常。只会抛出一个异常。
如果捕获中没有对应异常的catch,那么异常会交给JVM,程序中断,dff也就不会打印。

它的退出码是1,代表异常退出。

如果异常之间具有父子关系,一定是子类异常在前catch,父类异常在后catch,否则语法错误
比如不能Expection在第一个catch中。
- finally

不管try是否抛异常,finally中的代码都会执行。
所以finally一般用于进行资源释放。
根据编译器提示,把scanner写在try中,finally中就没有closel。

正常来说,finally一定会执行的。
下面这样也会执行finally。

throw用来抛出异常,throws用来声明异常。
- 自定义异常
有时候项目很复杂,不能像下面这样通过打印判断异常。这时候就需要自定义异常。


public class Test2 {public String name = "asd";public int id = 123;public void testh(String str, int a) throws UserNameExpection, IdExpection {if (!this.name.equals(str)) {System.out.println("姓名错误");throw new UserNameExpection();}if (this.id != a) {System.out.println("id错误");throw new IdExpection();}}public static void main(String[] args) throws UserNameExpection, IdExpection {try {Test2 test2 = new Test2();test2.testh("asdf", 123);}catch(UserNameExpection u){u.printStackTrace();System.out.println("用户名异常");}catch(IdExpection i){i.printStackTrace();System.out.println("id异常");}}
}

我们可以让异常打印特定的内容


