Java中供了一种识别和响应错误情况的一致性机制——异常处理机制,有效地异常处理能够使程序具有更强的健壮性、易于调试。本篇博客将详细介绍Java中的异常处理(Exception)。
目录:
在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为存在很多问题不是靠代码能够避免的,比如:客户输入数据的格式,读取文件是否存在,网络是否始终保持通畅等。这时就需要借助Java异常处理机制来解决这部分问题,合理的使用异常处理机制可以降低bug的产生,提高程序的健壮性。
☍ 异常概述与异常体系结构
▴ 异常概述
☃ 异常:在Java语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常)
☃ Java程序在执行过程中所发生的异常事件可分为两类:
➢ Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:栈溢出错误:StackOverflowError和堆溢出错误:OOM(OutOfMemoryError)。一般不编写针对性的代码进行异常处理,修改导致错误出现的代码即可。
public class ExceptionTest {
public static void main(String[] args) {
//栈(statck)溢出异常: java.lang.StackOverflowError
//main(args);
//堆(heap)溢出异常:java.lang.OutOfMemoryError
//Integer[] arr = new Integer[1020*1024*1024];
}
}
➢ Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:
✔ 空指针访问
✔ 试图读取不存在的文件
✔ 网络连接中断
✔ 数组下标越界
☃ 对于这些错误,一般有两种 解决方法:一是遇到错误就终止程序的运行(默认)。另一种方法是由程序员在编写程序时,就考虑到错误的
检测、错误消息的提示,以及错误的处理(主要解决异常的方法)。
☃ 捕获错误最理想的是在编译期间,但有的错误只有在运行时才会发生,如数组越界。
☃ 按异捕获的时间可分为:编译时异常
和运行时异常
。
▴ Exception异常分类:编译时异常&运行时异常
编译时异常
☃ 是指编译器要求必须处置的异常。即程序在运行时由于外界因素造成的一般性异常。编译器要求Java程序必须捕获或声明所有的编译时异常。
☃ 在Java中, Exception类中除了RuntimeException类及其子类外都是编译时异常,对应上图中受检异常。编译时异常的特点是Java编译器会对其进行检查,如果存在异常情况就必须对异常进行处理,否则程序无法通过编译,如读取空文件的异常。
☃ 对于这类异常,如果程序不处理,可能会带来意想不到的结果。
☃ 处理编译时期的异常有两种方式,具体如下:
(1)使用try…catch语句对异常进行捕获处理。
(2)使用throws关键字声明抛出异常,等待调用者对其处理,如果调用者不处理继续抛出异常。
运行时异常
☃ 是指编译器不要求强制处置的异常。一般是指编程时的逻辑错误,是程序员应该积极避免出现的异常。java.lang.RuntimeException类及它的子类都是运行时异常。
☃ 运行时异常的特点是Java编译器不会对其进行检查,也就是说,当程序中出现这类异常时,即使没有使用try…catch语句捕获或使用throws关键字声明抛出,程序也能编译通过(运行时可能会报错),如数组角标越界异常。
☃ 对于这类异常,可以视情况选择处理(不确定逻辑是否正确)或者不处理(确定逻辑正确时),因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响。
☍ 常见异常
▴ 常见运行时异常:java.lang.RuntimeException及其子类
空指针异常NullPointerException
public void NullPointerExceptionDemo() {
Object obj = null;
System.out.println(obj.toString());
}
数组角标越界异常:ArrayIndexOutOfBoundsException
public void ArrayIndexOutOfBoundException1() {
int[] arr = new int[3];
System.out.println(arr[5]);
}
public void ArrayIndexOutOfBoundException2() {
String string = "abcd";
System.out.println(string.toCharArray()[5]);
}
字符串角标越界异常:StringIndexOutOfBoundsException
public void StringIndexOutOfBoundExceptionDemo() {
String str = "abcd";
System.out.println(str.charAt(5));
}
类型转换异常:java.lang.ClassCastException
public void ClassCastExceptionDemo() {
class Dog{
}
class Cat{
}
//Dog dog = new Cat(); 编译不通过,语法错误
Object obj = new Dog();
Cat cat = (Cat)obj;
}
数字格式异常:java.lang.NumberFormatException
public void NumberFormatExceptionDemo(){
String str = "abc";
//Integer number = new Integer(str);
int num = Integer.parseInt