异常
java通过对这一类不正常的现象进行描述,并封装为对象。
1. java的异常体系包含在java.lang这个包默认不需要导入。
2. java异常体系图
----------------------------------------------------
Throwable:
Throwable类常用方法:
1. toString() 输出该异常的类名。
2. getMessage() 输出异常的信息,需要通过构造方法传入异常信息。
3. printStackTrace() 打印栈信息。
-------------------------------
错误
它指的是一个合理的应用程序不能截获的严重的问题。大多数都是反常的情况。错误是JVM的一个故障(虽然它可以是任何系统级的服务)。所以,错误是很难处理的,所以Error不是try-catch的处理对象,而JVM一般的处理方式是终止发生错误的线程,一般的开发人员是无法处理这些错误的。
-------------------------------------------------
异常
1. RuntimeException和RunntimeException的子类: 运行时异常无需进行处理,直接找到出现问题的代码,进行规避。
2. 非运行时异常(受检异常) :如果出现了非运行时异常必须进行处理throw或者try{}catch(){}处理,否则编译器报错
二. 异常处理
1. 自行处理
使用try catch处理, 如果没有进行try catch处理,出现异常程序就停止。进行处理后,程序会继续执行
实例:
class Demo{
public static void main(String[] args){
try{
dev(4,0);
}catch(Exception e){
e.printStackTrace();
}
}
public static void dev(int x,int y){
System.out.println(x/y);
}
}
2. 抛出处理
class zeroException extends Exception{
public zeroException(String message){
super(message);
}
}
class Demo{
public static void main(String[] args){
try{
dev(4,0);
}catch(Exception e){
e.printStackTrace();
}
}
public static void dev(int x,int y) throws zeroException{
if (0==y) {
throw new zeroException("除数不能为0");
}
System.out.println(x/y);
}
}
(1)注意:
1. 程序中有多个语句可能发生异常,可以都放在try语句中。并匹配对个catch语句处理。
2. 如果异常被catch匹配上,接着执行try{}catch(){} 后的语句。没有匹配上程序停止。
3. try中多个异常同时出现,只会处理第一条出现异常的一句,剩余的异常不再处理。
4. 使用多态机制处理异常。
5. 程序中多态语句出现不同异常,出现了多个catch语句。简化处理。
6. 使用多态,使用这些异常的父类进行接收。(父类引用接收子类对象)
7. 处理异常应该catch异常具体的子类,可以处理的更具体,不要为了简化代码使用异常的父类。
(2)try catch使用细节:
1. try语句不能单独存在,可以和catch、finally组成 try...catch...finally、try...catch、try...finally三种结构。2. catch语句可以有一个或多个,finally语句最多一个,try、catch、finally这三个关键字均不能单独使用。
3. try、catch、finally三个代码块中变量的作用域分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面。
4. 多个catch块时候,Java虚拟机会匹配其中一个异常类或其子类,就执行这个catch块,而不会再执行别的catch块。(子类在上,父类在下)。
5. throw语句后不允许有紧跟其他语句,因为这些没有机会执行。
6. 如果一个方法调用了另外一个声明抛出异常的方法,那么这个方法要么处理异常,要么声明抛出。
(3)多个catch语句之间的执行顺序
1. 是进行顺序执行,从上到下。2. 如果多个catch 内的异常有子父类关系。
1. 子类异常在上,父类在最下。编译通过运行没有问题
2. 父类异常在上,子类在下,编译不通过。(因为父类可以将子类的异常处理,子类的catch处理不到)。3. 多个异常要按照子类和父类顺序进行catch
(4)子类父类关系
1:子类覆盖父类方法是,父类方法抛出异常,子类的覆盖方法可以不抛出异常,或者抛出父类方法的异常,或者该父类方法异常的子类。2:父类方法抛出了多个异常,子类覆盖方法时,只能抛出父类异常的子集
3:父类没有抛出异常子类不可抛出异常
5:子类发生非运行时异常,需要进行try{}catch的(){}处理,不能抛出。
6:子类不能比父类抛出更多的异常
(5)throw和throws的区别
1. 相同:都是用于做异常的抛出处理的。2. 不同点:throws 后跟的是异常类,可以跟多个,用逗号隔开,是针对方法抛出的异常。throw 后跟异常对象。针对对象抛出的异常。
(6)finally
1.finally主要用于释放系统资源。
2:在处理异常的时候该语句块只能有一个。
3:无论程序正常还是异常,都执行finally。如果JVM退出了System.exit(0),finally就不执行。
4:return都不能停止finally的执行过程。