Java异常机制
Java异常机制
Java的异常:
- Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。
- 在Java API中已经定义了许多异常类,通常分为两类:异常Exception和 错误Error
接下来通过一张图来展示Throwable类的继承体系,如下图所示。

通过图中可以看出,Throwable有两个直接子类Error和Exception,其中Error代表程序中产生的错误,Exception代表程序中产生的异常。
- Error:Error类称为错误类,它表示Java运行时产生的系统内部错误或资源耗尽的错误,是比较严重的,仅靠修改程序本身是不能恢复执行的。
- Exception类称为异常类,它表示程序本身可以处理的错误,在开发Java程序中进行的异常处理,都是针对Exception类及其子类。在Exception分支中有一个重要的子类RuntimeException(运行时异常)。
- ArrayIndexOutOfBoundsException (数组下标越界)
- NullPointerException (空指针异常)
- ArithmeticException (算术异常)
- MissingResourceException (丢失资源)
- ClassNotFoundException (找不到类)异常,这些异常都是不检查异常,程序中可以选择捕获,也可以不处理。
Error与Exception的区别:
Error通常是灾难性的致命错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程;而Exception通常情况下时可以被程序处理的,并且在程序中应该尽可能去处理这些异常。
异常处理机制:
Java中提供了一种对异常进行处理的方式——异常捕获。
异常处理五个关键字:try、catch、finally、throw、throws
Java中允许在方法的后面使用throws关键字对外声明该方法有可能发生的异常(自动抛出异常),这样调用者在调用方法时,就明确地知道该方法有异常,并且必须在程序中对异常进行处理,否则编译无法通过。
注意:throw一般用在于方法里面,而throws一般直接用在方法定义的后面。
Throwable类中的常用方法:

public static void main(String[] args) {
int a = 1;
int b = 0;
//捕获多个异常:需要按Throwable类的继承,从小到大向下定义
try { //try监控区域
System.out.println("正常输出:" + a / b);
}catch (ArithmeticException e) { //捕获监控区域里面代码的异常情况 catch(想要捕获的异常类型)
e.getMessage();
System.out.println("输出异常");
}finally { //处理捕获后的工作,无论出不出异常,finally都会执行
System.out.println("异常捕获结束");
}//finally一般可以不需要加上去
}
自定义异常:
- 在Java中允许用户自定义异常,但自定义的异常类必须继承自Exception或其子类。
- 在实际开发中,如果没有特殊的要求,自定义的异常类只需继承Exception类,在构造方法中使用super()语句调用Exception的构造方法即可。
- 可通过throw关键字用于在方法中声明抛出异常的实例对象。
public class Zexcept2 extends Exception{ //自定义一个异常抛出
private int id;
public Zexcept2(int e) {
this.id = e;
}
//toString异常打印信息
public String toString() {
return "错误信息:{ id =" + id + "}";
}
}
public class Zexcept1 { //调用自定义的异常
public static void main(String[] args) {
try{
test(11); //抛出异常-->错误信息:{ id =" + id + "}
}catch (Zexcept2 e) {
System.out.println("Exception" + e);
}
}
static void test(int e) throws Zexcept2{
System.out.println("输出" + e);
if (e > 10) {
throw new Zexcept2(e); //抛出异常
}
System.out.println("TRUE");
}
}

浙公网安备 33010602011771号