一、简单原理
- java把所有非正常情况分成两种:异常(Exception)和错误(Error),都是继承自Throwable父类。
- 1.Error错误:一般是指虚拟机相关的问题,如系统崩溃,虚拟机出错误等,这种错误无法恢复或不可能捕获,将导致应用程序中断,通常不处理。
- 2.Exception异常:指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。
- 我们所需要关心的是Exception. Execption可以分为java标准定义的异常和程序员自定义异常2种.
- 1.一种是当程序违反了java语规则的时候,JAVA虚拟机就会将发生的错误表示为一个异常.这里语法规则指的是JAVA类库内置的语义检查。
- 2.另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是Thowable的子类。
通常,Java的异常(包括Exception和Error)分为可查的异常(checked exceptions)和不可查的异常(unchecked exceptions)
二、关键字
在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。
java异常机制主要依赖于try、catch、finally、throw、throws五个关键字。
抛出异常:1.当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。
2.任何Java代码都可以抛出异常,如:自己编写的代码、来自Java开发环境包中代码,或者Java运行时系统。无论是谁,都可以通过Java的throw语句抛出异常。
3.从方法中抛出的任何异常都必须使用throws子句。
public class ThrowCasecade {
public void m1(){
try {
m2();
} catch (Exception e) {
e.printStackTrace();
}
}
private void m2() throws Exception {
System.out.println("m2");
try {
m3();
} catch (IOException e) {
//转换为特定的异常,以便于上层调用的方法理解该异常
e.printStackTrace();
throw new Exception();
}
}
private void m3() throws IOException {
System.out.println("m3");
m4();
}
private void m4() throws IOException {
System.out.println("m4");
m5();
}
private void m5() throws IOException {
System.out.println("m5");
throw new IOException("文件未找到");
}
public static void main(String[] args) throws IOException {
new ThrowCasecade().m1();
}
}
捕获异常:1.一个方法所能捕捉的异常,一定是Java代码在某处所抛出的异常。简单地说,异常总是先被抛出,后被捕捉的。
2.捕捉异常通过try-catch语句或者try-catch-finally语句实现。
总体来说,Java规定:对于可查异常必须捕捉(trycatch)、或者声明(throws)抛出(throw)。允许忽略不可查的RuntimeException和Error。
JAVA语言如何进行异常处理
执行步骤:
1.如果执行try块中的业务逻辑代码时出现异常,系统自动生成一个异常对象,该异常对象被提交给java运行环境,这个过程称为抛出(throw)异常。
2.当java运行环境收到异常对象时,会寻找能处理该异常对象的catch块,如果找到合适的cathc块并把该异常对象交给catch块处理,那这个过程称为捕获(catch)异常;如果java运行时环境找不到捕获异常的catch块,则运行时环境终止,jav程序也将退出。
注意
注意1:不管程序代码块是否处于try块中,甚至包括catch块中代码,只要执行该代码时出现了异常,系统都会自动生成一个异常对象,如果程序没有为这段代码定义任何catch块,java运行环境肯定找不到处理该异常的catch块,程序肯定在此退出。
注意2:try块后可以有多个catch块,try块后使用多个catch块是为了针对不同异常类提供的不同的异常处理方式。当系统发生不同意外情况时,系统会生成不同的异常对象,java运行时就会根据该异常对象所属的异常类来决定使用哪个catch块来处理该异常。
注意3:通常情况下,如果try块被执行一次,则try块后只有一个catch块会被执行,绝不可能有多个catch块被执行,除非在循环中使用类continue开始下一次循环,下一次循环又重新运行了try块,这才可能导致多个catch块被执行。
注意4:进行异常捕获时,一定要记住先捕获小的异常,再捕获大的异常。