异常机制
异常
就是错误的另外一种说法
性质
鲁棒性
就是系统的健壮性
异常分两种
编译时
在执行javac命令出错,是编译时
在eclipse中 没有运行 就报错,就是编译时
运行时
执行java命令出错,是运行时
在java中有一个专门模拟所有异常和错误的类(Throwable) 所有的异常类都必须继承这个类
try…catch
try…catch…: 一般用在客户端
语法 :
try{
高风险代码;
}catch(异常类型 变量){
错误的处理机制;
}
使用try…catch…不会再终止生命周期,所以叫错误就不太合适了,而应该是一种对可能出现错误的地方做出对应的提示操作,使我们的异常,成为了正常程序中的一部分
public class Exception_01 {
public static void main(String[] args) {
int a = 10;
int b = 1;
if(b == 0) {
System.out.println("除数不能为0");
}else {
int c = a/b;
System.out.println(c);
}
try {
int c = a/b;
System.out.println(c);
}catch(Exception e) {
e.printStackTrace();
System.out.println("除数不能为0");
}
System.out.println("-------");
}
}
1 用异常类和异常类的父类都可以捕捉
2 捕捉之后的处理措施
1 打印追踪栈帧
printStackTrace();
2 错误栈帧的内存地址
getStackTrace();
3 错误提示信息
getMessage();
public class Exception_02 {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("asdasd.txt");
}catch(FileNotFoundException e) {
e.printStackTrace();
System.out.println("--------");
System.out.println(e.getStackTrace());
System.out.println("------------");
System.out.println(e.getMessage());
}
}
}
try...catch
try{
可能出现异常的代码;
}catch(异常类型1 变量){
处理措施;
}catch(异常类型2 变量){
处理措施;
}catch(异常类型3 变量){
处理措施;
}
1 catch 语句可以根据代码的异常写多个
2 从上往下,必须是从子类到父类,或者没有继承关系,要不然会因为多态的原因,把子类异常捕捉
3 虽然写了多个catch,但是只会有一个 执行,因为最先出错的语句之后的代码不执行,直接执行catch
public class Exception_04 {
public static void main(String[] args) {
try {
//FileNotFoundException
new FileInputStream("");
String s = null;
//NullPointerException
s.equals("");
}catch(FileNotFoundException e){
System.out.println("找不到指定文件");
}catch(NullPointerException e){
System.out.println("不能使用null调用成员属性");
}catch(Exception e){
System.out.println("其他异常");
}
}
}
java1.7开始,有一个新的写法,一次catch 多个异常,但是 多个异常之间不能有继承关系,如果有就直接写父类
catch(异常类型1 | 异常类型2| 异常类型3|.... 变量)
可以对多个异常,做相同的处理操作
public class Exception_05 {
public static void main(String[] args) {
try {
//FileNotFoundException
new FileInputStream("");
String s = null;
//NullPointerException
s.equals("");
}catch (FileNotFoundException | NullPointerException e) {
System.out.println("1111111111111");
} catch (Exception e) {
System.out.println("22222222222");
}
}
}
不同的异常机制的选择
1 有些错误我们不想处理,或者没有办法处理(这个通常就是在类库中),这个时候就把错误信息交给调用人员,这种情况 直接使用throws
2 我们能够处理的,就try…catch…(一般在客户端,main)
Throwable异常类的祖类
Exception
直接子类都是编译时异常,只有一个RunTimeException是运行时异常
Error
系统内部错误,比如栈内存溢出,虚拟机错误等,这种情况JVM会选择终止程序,不需要我们做操作