在 Java 中程序的错误主要是语法错误和语义错误,一个程序即使在编译时没有错误信息产生,在运行时也有可能出现各种各样的错误导致程序退出,这些错误在 Java 中称为异常
一、异常的基本概念
Java 的异常处理机制具有易于使用,可自行定义异常类,处理抛出的异常同时又不会降低程序运行的速度等优点。因而在 Java 程序设计时,应充分地利用 Java 的异常处理机制,以增进程序的稳定性及效率。
public class Test{
public static void main(String[] args) {
System.out.println("**************** 计算开始 ****************");
int i = 10;
int j = 0;
int temp = i/j;//此处会产生异常
System.out.println("两个数字相除结果:" + temp);
System.out.println("**************** 计算结束 ****************");
}
}
try{
//有可能出现异常的语句
}catch(异常类 异常对象){
//编写异常的处理语句
}[catch(异常类 异常对象){
} ... ]
[finally{
一定会运行到的程序代码;
}]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
格式中,会在 try 语句之中捕获可能出现的异常代码,如果在 try 中产生了异常,则程序会自动跳转到 catch 语句中找到匹配的异常类型进行相应的处理。
最后不管程序是否会产生异常,肯定都会执行到 finally 语句,finally 语句就作为异常的统一出口。
其实,finally 块是可以省略的,如果省略了 finally 块,则在 catch() 块运行结束后,程序会跳到 try-catch 块之后继续执行。
public class Test{
public static void main(String[] args) {
System.out.println("******** 计算开始 ********");
int i =10;
int j = 0;
try {
int temp = i/j;
System.out.println("相除结果:" + temp);
}catch (ArithmeticException e){//捕捉算术异常
System.out.println("出现异常了:" + e);//出现异常执行异常处理语句
}finally {//异常的处理语句
System.out.println("******** 计算结束 ********");
}
}
}
- 11
- 12
- 13
- 14
- 15
捕获多个异常示例:
public class Test{
public static void main(String[] args) {
System.out.println("******** 计算开始 ********");
int i = 0;
int j = 0;
try {
String str1 = args[0];
String str2 = args[1];
i = Integer.parseInt(str1);//将第一个参数由字符串变为整型
j = Integer.parseInt(str2);//将第二个参数由字符串变为整型
int temp = i/j;
System.out.println("相除结果:" + temp);
}catch (ArithmeticException e){//捕捉算术异常
System.out.println("出现异常了:" + e);//出现异常执行异常处理语句
}catch (NumberFormatException e){
System.out.println("数字转换异常:" + e);//处理数字格式化异常
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("数组越界异常:" + e);//处理数组越界
} finally {
System.out.println("******** 计算结束 ********");
}
}
}
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
三、异常类的继承结构
在整个Java的异常结构中,实际上有两个最常用的类,分别为 Exception 和 Error,这两个类都是 Throwable 的子类。
- Exception:一般表示的是程序中出现的问题,可以直接使用 try…catch 处理
- Error:一般指的是 JVM 错误,程序中无法处理
一般情况下,开发中习惯于将 Exception 和 Error 统称为异常,而算术异常、数字格式化异常等都属于 Exception 的子类
在catch 语句输出异常时,处理可以直接使用System.out.println(异常对象)
的方式打印异常信息外,有时也会直接使用 Exception 类中的 printStackTrace()
方法输出异常信息
e.printStackTrace();
//使用这种方式打印的异常信息是最完整的
- 1
- 2
四、Java 的异常处理机制
在整个 Java 的异常处理中,实际上也是按照面向对象的方式进行处理的:
(1)一旦产生异常,则首先会产生一个异常类的实例化对象
(2)在 try 语句中对此异常对象进行捕捉
(3)产生的异常对象与 catch 语句中的各个异常类型进行匹配,如果匹配成功,则执行catch 语句中的代码
由之前的对象多态性可知,所有的子类实例可以全部使用父类接收,因此可以利用向上转型,让所有的异常对象都使用 Exception 接收。
public class Test{
public static void main(String[] args) {
System.out.println("******** 计算开始 ********");
int i = 0;
int j = 0;
try {
String str1 = args[0];
String str2 = args[1];
i = Integer.parseInt(str1);//将第一个参数由字符串变为整型
j = Integer.parseInt(str2);//将第二个参数由字符串变为整型
int temp = i/j;
System.out.println("相除结果:" + temp);
}catch (ArithmeticException e){//捕捉算术异常
System.out.println("出现异常了:" + e);//出现异常执行异常处理语句
}catch (NumberFormatException e){
System.out.println("数字转换异常:" + e);//处理数字格式化异常
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("数组越界异常:" + e);//处理数组越界
}catch (Exception e){
System.out.println("其他异常:" + e);//处理其他异常
}
System.out.println("******** 计算结束 ********");
}
}
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
程序最后直接使用 Exception 进行其他异常的捕获,则本程序出现的全部异常就都可以处理了,需要注意在 Java 中所有捕获范围小的异常必须放在捕获大的异常之前,否则程序在编译时就会出现错误提示
五、关于Throwable 和 Exception
代码中也可以使用 Throwable 捕获异常,因为Throwable捕获的范围是最大的。
但是一般开发中是不会直接使用 Throwable 进行捕获的,对于 Throwable 来说有 Exception、Error 两个子类,Error 类本身不需要程序处理,而程序中需要处理的只是 Exception,所以没有必要使用 Throwable
同时对于一个程序来说,如果有多个异常最好分别进行捕获,而不要直接使用 Exception 捕获全部异常