Java拾贝第七天——异常
Java拾贝不建议作为0基础学习,都是本人想到什么写什么
在程序实际运行过程中,可能存在大量的未知问题,所以在程序中对错误的处理是极其重要的。
Java提供的异常处理机制可以更好地解决这方面的问题。
认识异常
public static void main(String[] args) {
System.out.println("程序开始");
int i = 0;
int j = 10;
int x = j / i;
System.out.println("程序结束");
}
程序运行结果:
程序开始
Exception in thread "main" java.lang.ArithmeticException: / by zero
at moudle1.Test7.main(Test7.java:8)
在上述代码中,因为被除数是0,所以程序中就出现了异常。
从结果上可以发现。一旦出现了异常,程序就立刻退出了,所以后面的程序结束并没有出现
如果想要程序正确执行,则必须处理异常
处理异常
在Java的异常处理中,实际上也是按照面向对象的方式进行处理,处理步骤如下:
- 一旦产生异常,首先会产生一个异常类的实例化对象
- 在try语句中对该对象进行捕获
- 产生的对象与catch语句中各个异常类进行匹配
- 如果匹配成功,则执行该catch语句中的代码
try {
//可能出现异常的代码
} catch (异常类 异常对象变量) {
//异常处理
}
至此,使用try catch语句修改代码:
public static void main(String[] args) {
System.out.println("程序开始");
int i = 0;
int j = 10;
try {
int x = j / i;//可能出现异常的代码
} catch (ArithmeticException e) {//数学异常
System.out.println(e);//把异常对象打印出来
}
System.out.println("程序结束");
}
程序运行结果:
程序开始
java.lang.ArithmeticException: / by zero
程序结束
从结果上可以看到,因为程序加入了异常的处理,当异常发生后,程序没有中断执行。
finally
实际上,try catch语句还要一个finally关键字,它是所有异常的最终出口。
finally不是必须的
修改代码:
public static void main(String[] args) {
System.out.println("程序开始");
int i = 0;
int j = 10;
try {
int x = j / i;
} catch (ArithmeticException e) {
System.out.println(e);
}finally {
System.out.println("不管有没有捕获到异常,这finally会执行");
}
System.out.println("程序结束");
}
程序运行结果:
程序开始
java.lang.ArithmeticException: / by zero
不管有没有捕获到异常,这finally会执行
程序结束
常见的异常类型:
NullPointerException:空异常
IndexOutOfBoundsException:下标越界异常
NumberFormatException:数字格式化异常
ArithmeticException:算术异常
当然,程序也不会只出现一个异常,肯定会同时存在多个异常,此时需要使用多个catch语句
try {
//可能出现异常的好多代码
//好多代码...
} catch (ArithmeticException e) {
System.out.println(e);
} catch (NumberFormatException e) {//作用域不同
System.out.println(e);
} catch (IndexOutOfBoundsException e) {
System.out.println(e);
}finally {
System.out.println("所有异常的最终出口");
}
这也太麻烦了吧!如果压根不止这三个异常岂不是要写非常多catch。
从多态那里我们知道向上转型。
至此,修改代码:
try {
//可能出现异常的好多代码
//好多代码...
} catch (Exception e) {//直接捕获其父类
System.out.println(e);
}finally {
System.out.println("所有异常的最终出口");
}
异常类关系
仅展示部分
错误:可以被捕获以及处理
异常:程序对此无能为力
注意
*在多个catch语句中,异常应该从小到大进行捕获。
否则全部在上方进行捕获处理了,程序也会出现编译错误*
public static void main(String[] args) {
System.out.println("程序开始");
int i = 0;
int j = 10;
try {
int x = j / i;
}catch (Exception e){
System.out.println(e);
} catch (ArithmeticException e) {
System.out.println(e);
}finally {
System.out.println("不管有没有捕获到异常,这finally会执行");
}
System.out.println("程序结束");
}
程序运行结果:
java: 已捕获到异常错误java.lang.ArithmeticException
一般开发中,使用Exception不管出现什么异常都可以直接捕获处理。
项目开发中,不建议使用Exception捕捉全部异常,因为异常问题会不具体。
try catch语句中
try {
}catch (Exception e){
System.out.println(e);
e.printStackTrace();
}
System.out.println()是在控制台输出异常信息
建议调用printStackTrace()方法打印异常栈,这是一个简单有用的快速打印异常的方法。