1、异常实现及分类

先看下异常类的结构图

java 错误码 定义 java 错误码规范_代码块

java

上图能够简单展现一下异常类实现结构图,固然上图不是全部的异常,用户本身也能够自定义异常实现。上图已经足够帮咱们解释和理解异常实现了:ide

1.全部的异常都是从Throwable继承而来的,是全部异常的共同祖先。

2.Throwable有两个子类,Error和Exception。

其中Error是错误,对于全部的编译时期的错误以及系统错误都是经过Error抛出的。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,由于它们在应用程序的控制和处理能力之 外,并且绝大多数是程序运行时不容许出现的情况。对于设计合理的应用程序来讲,即便确实发生了错误,本质上也不该该试图去处理它所引发的异常情况。在 Java中,错误经过Error的子类描述。编码

3.Exception

是另一个很是重要的异常子类。它规定的异常是程序自己能够处理的异常。异常和错误的区别是,异常是能够被处理的,而错误是无法处理的。 设计

4.Checked Exception

可检查的异常,这是编码时很是经常使用的,全部checked exception都是须要在代码中处理的。它们的发生是能够预测的,正常的一种状况,能够合理的处理。好比IOException,或者一些自定义的异常。除了RuntimeException及其子类之外,都是checked exception。指针

5.Unchecked Exception

RuntimeException及其子类都是unchecked exception。好比NPE空指针异常,除数为0的算数异常ArithmeticException等等,这种异常是运行时发生,没法预先捕捉处理的。Error也是unchecked exception,也是没法预先处理的。code

2、异常的处理

代码中的异常处理实际上是对可检查异常的处理。

1. 经过try...catch语句块来处理:blog

e.g.
try
{
// 程序代码
}catch(ExceptionName e1)
{
//Catch 块
}

Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。继承

若是发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是同样。虚拟机

2. 另外,也能够在具体位置不处理,直接抛出,经过throws/throw到上层再进行处理,具体的,若是一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。也可使用 throw 关键字抛出一个异常,不管它是新实例化的仍是刚捕获到的。

下面方法的声明抛出一个 RemoteException 异常:it

import java.io.*;
public class className
{
public void deposit(double amount) throws RemoteException
{
// Method implementation
throw new RemoteException();
}
//Remainder of class definition
}

3. finally关键字

finally 关键字用来建立在 try 代码块后面执行的代码块。

不管是否发生异常,finally 代码块中的代码总会被执行。

在 finally 代码块中,能够运行清理类型等收尾善后性质的语句。

finally 代码块出如今 catch 代码块最后,语法以下:
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}finally{
// 程序代码
}