在java中,异常会导致运行时错误。异常就是一个表示阻止执行正常进行的错误或情况。如果异常没有被处理,那么程序将会非正常终止。该如何处理这个异常,以使程序可以继续运行或者平稳终止呢?
不正常的情况分为两大类:
1、一般不可处理:Error
特点:有jvm抛出的严重性问题,这种问题一般不针对性处理,直接修改程序。
2、可处理的:Exception
Throwable:该体系的特点就在于可抛性,Throwable及其所有的子类都具可抛性。
Exception异常分类:
1、编译时被检测异常。只要是Exception除RuntimeException及其子类之外都是,这种问题一旦出现。希望在编译时就进行检测,让这种问题有对应的处理方式。
2、编译时不坚持异常(运行时异常)。就是RuntimeException和其子类。这种问题的发生,无法让功能继续,运算无法进行,更多是因为调用者或者引发了内部状
态的原因导致的。这种问题一般不处理,直接变异通过。在运行时,让调用者调用时的程序强制停止,让调用者对代码进行修改。
从异常中获取信息:
getMessage():String:获取这个异常的信息
toString():String:返回三个字符的连接:①异常类的全名;②“:”(冒号或空格);③getMessage()方法
printStackTrace():void:获取异常类名和信息,以及异常出现的位置。
异常的处理模型基于
三种操作:声明一个异常,抛出一个异常和捕获一个异常。
1、声明异常。在java中,当前执行的语句必属于某个方法。每个方法都必须声明它可能抛出的必检异常的类型。这就要在方法中声明一个异常,在方法头中使用关键字
throws。如果方法抛出多个异常,就可以在关键字throws后添加一个用逗号分隔的异常列表:
public void myMethod() throws Exception1,
Exception2,…… ExceptionN
2、抛出异常。检测一个错误的程序可以创建一个正确异常类型的实例来抛出它。抛出异常的关键字是throw(用在函数内)。如:
throw new IOException("string")
3、捕获异常。当抛出一个异常时,可以在try-catch-finally块中捕获和处理它。如:
try{
可能出现异常的代码
}catch(Exception1 ex){
异常处理代码1
}catch(Exception2 ex){
异常处理代码2
}……catch(ExceptionN ex){
异常处理代码N
}finally{
释放资源
}
try-catch-finally 组合特点:
1、try-catch-finally
2、try-catch(多个):当没有必要资源释放时,可以不用定义finally。
3、try-finally:异常无法直接catch处理,但是资源需要释放关闭。
finally语句永远被执行,即使在到达finally块之前有一个return语句,finally语句还是会执行。除非退出jvm:System.exit(0);
链式异常:有时候,可能需要同原始异常一起抛出一个新异常,如,
public class Demo{
public static void main(String[] args){
try{
//main方法调用method1
method1();
}
//method1抛出的新异常被捕获
catch(Exception ex){
ex.printStackTrace(); //首先显示method1中抛出的新异常,然后显示method2中抛出的原始异常。
}
}
public static void method1() throws Exception{
try{
//method1调用method2method2();
}
// method2异常被捕获catch(Exception ex){
//包装新异常throw new Exception("New info form method1",ex);
}
}
public static void method2() throw Exception{
//method2 抛出异常throw new Exception( "New info form method2");}
}
自定义异常:定义类继承Exception或者RuntimeException类。
class MyException extends Exception{
MyException(){}
MyException(String message ){
super(message);
}}
class MyException extends rRuntimeException{或
MyException(){}MyException(String message ){
super(message);
}
}
子类父类间异常的继承。子类覆盖父类只能抛出父类的异常或者异常的子类或其子集,如果父类的方法没有抛出异常,那么子类绝对不能抛,只能try。在catch块中,如果能够捕获一个父类的异常对象,它就能捕获那个父类的所有子类的异常对象。
在catch块中异常被指定的顺序也很重要。如果父类的catch块出现在子类的catch块之前,就会导致编译错误。
异常的处理原则:
1、函数内容如果抛出需要检测的异常,那么函数上必须要声明,否则必须在函数内用try-catch捕捉,否则编译失败。
2、如果调用到了声明异常的函数,要么try-catch要么throws,否则编译失败。
3、功能内部可以解决,用catch;解决不了,用throws告诉调用者,由调用者解决。4、一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性处理。
对异常的巩固先到此了,概念比较多,需要多记多背。