Java代码出现异常后,是否能继续运行代码
测试一:
public class Test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Object> list = new ArrayList<Object>();
System.err.println("异常前===>代码");
list.get(0);
System.err.println("异常后===>代码");
}
}
测试结果:
程序抛出异常后没有继续执行代码
异常前===>代码
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:657)
at java.util.ArrayList.get(ArrayList.java:433)
at test1.Test1.main(Test1.java:12)
测试二:
public class Test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Object> list = new ArrayList<Object>();
System.err.println("异常前===>代码");
try {
list.get(0);
} catch (IndexOutOfBoundsException e) {
// TODO: handle exception
System.err.println("抛出异常===>代码");
e.printStackTrace();
}
System.err.println("异常后===>代码");
}
}
测试结果:
程序抛出异常后被捕获,继续执行代码
异常前===>代码
抛出异常===>代码
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:657)
at java.util.ArrayList.get(ArrayList.java:433)
at test1.Test2.main(Test2.java:13)
异常后===>代码
测试三:
public class Test3 {
public static void main(String[] args) {
System.err.println("异常前===>代码");
if(true)
throw new IndexOutOfBoundsException("error");
System.err.println("异常后===>代码");
}
}
测试结果:
与测试一一致,抛出异常后没有继续执行代码
异常前===>代码
Exception in thread "main" java.lang.IndexOutOfBoundsException: error
at test1.Test3.main(Test3.java:11)
测试四:
public class Test4 {
public static void main(String[] args) {
System.err.println("异常前===>代码");
try {
if(true)
throw new IndexOutOfBoundsException("error");
} catch (Exception e) {
// TODO: handle exception
System.err.println("抛出异常===>代码");
e.printStackTrace();
}
System.err.println("异常后===>代码");
}
}
测试结果:
与测试二一致,抛出异常后继续执行代码
异常前===>代码
抛出异常===>代码
java.lang.IndexOutOfBoundsException: error
at test1.Test4.main(Test4.java:8)
异常后===>代码
总结:
Java异常分为两大类Error和Exception,他们都继承于Throwable。
Error是虚拟机抛出的错误。
Exception是代码运行抛出的错误。
代码能够捕获处理的是Exception,其中Exception的派生子类RuntimeException(如:空指针异常,数组索引溢出异常等)不强制代码进行处理。但根据上述测试,为了代码能够正常执行,我们应该对Exception进行捕获处理。
RuntimeException是比较难在编码时发现,需要多次代码测试才能发现。