Java程序运行过程中,经常会遇到异常情况,遇到最多的应该是NullPointException异常。今天有空,对异常进行了一次小总结。
Java规范中Exception是Throwable子类,Throwable还有另一个子类Error。Error一般是虚拟机抛出的比Exception更严重的异常,根据直译也可以叫做错误,属于虚拟机系统级错误,程序基本不可以通过后续代码修复,这里不做重点讨论。
Exception下面有许多继承子类
Exception众多子类可以分为两种一种是受检异常(Checked exceptions),另一种是非受检异常(Checked exceptions)。
针对这两种异常,它们处理方式是一样。两种处理方式, 1、在方法调用时处理掉catch,异常处理以后后续可以继续执行 2、向上层继续抛出throws,后续代码不再执行。以非受检异常说明这两种处理方式
catch处理
package com.cib.bean;
import org.junit.Test;
public class Order {
private int i;
@Test
public void test01() {
try {
i = 10 / 0;//以一种比较明显错误说明
} catch (ArithmeticException e) {
e.printStackTrace();
}
System.out.println("代码继续执行");
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
}
java.lang.ArithmeticException: / by zero
at com.cib.bean.Order.test01(Order.java:10)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
代码继续执行
单元测试时候,运行到i = 10 / 0; 抛出了算术异常,这个时候我们对异常进行了处理,不影响后续打印代码可以继续执行。
throws处理
package com.cib.bean;
import org.junit.Test;
public class Order {
private int i;
public void test01() throws ArithmeticException{
i=10/0;
System.out.println("代码继续执行");
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
}
这个时候运行,程序执行到 i=10/0;时
系统直接报出异常,后续代码不继续执行,System.out.println("代码继续执行"); 没有执行下去,程序终止。
以上两种处理方式比较,可以得到这样的结论:
对于出现异常代码throws,那么出现异常处代码其后代码不再继续执行。如果catch处理,不影响异常代码后续代码处理。
另外,当我们在其他方法中调用一段代码,这段代码通过throws抛出异常,这个时候需要也对异常进行处理,否则编译不通过。
end~~~欢迎交流,指正