(2)异常
Java 的异常机制主要依赖干 try、catch、finally、throw 和 throws 五个关键字。
其中 try 关键字后紧跟一个花括号扩起来的代码块(花括号不可省略),简称 try 块,它里面放置可能引发异常的代码。
catch后对应异常类型和一个代码块,用于表明该 catch 块用于处理这种类型的代码块。
多个 catch 块后还可以跟一个 finally 块,finally 块用于回收在 try 块里打开的物理资源,异常机制会保证 finally 块总被执行。
throws 关键字主要在方法签名中使用,用于声明该方法可能抛出的异常。
throw 用于抛出—个实际的异常,throw 可以单独作为语句使用,抛出一个具体的异常对象 。
继承关系:
Java把所有的非正常情况分为两大类:异常(Exception)和错误(Error),他们都是Throwable的子类。
Error:和虚拟机有关的问题,如系统崩溃、虚拟机错误等,这些错误无法恢复或者不可能被抓取,将导致应用程序中断,应用程序通常无法处理这些错误,因此不应该用异常处理方法来处理Error。同样,也不能在throws字句中声明该方法可能抛出Error。
Exception:程序中出现的非正常情况,其中异常又分为两类,RuntimeException(运行时异常)和CheckedException(检查时异常),这两类异常都是Exception的子类,其中RuntimeException及其子类不需要开发者显示处理。如果一个Exception没有继承RuntimeException类,则属于CheckedException,这类异常通常需要开发者显示处理。否则会出现编译错误。
public class ExceptionDemo {
/**
* 定义方法,该方法抛出算术异常
* 算术异常是运行时异常 继承自RuntimeException的类是运行时异常,不用显式处理
* @throws ArithmeticException
*/
public void division() throws ArithmeticException{
}
/**
* 定义方法,该方法抛出检查时异常
* 检查时异常要求开发者必须显示处理
* @throws ClassNotFoundException
*/
public void add() throws ClassNotFoundException{
}
public static void main(String[] args) {
ExceptionDemo ed = new ExceptionDemo();
//因为该方法抛出的是运行时异常,即使不处理也不会发生编译错误
ed.division();
//该方法抛出的是检查时异常,要求开发者显示处理
//如果不处理则编译错误
//add.hello();
}
}
异常处理机制:
try...catch捕获异常:
public class ExceptionDemo {
/**
* 定义方法,该方法抛出算术异常
* 算术异常是运行时异常 继承自RuntimeException的类是运行时异常,不用显式处理
* @throws ArithmeticException
*/
public void division() throws ArithmeticException{
}
/**
* 定义方法,该方法抛出检查时异常
* 检查时异常要求开发者必须显示处理
* @throws ClassNotFoundException
*/
public void add() throws ClassNotFoundException{
}
public static void main(String[] args) {
ExceptionDemo ed = new ExceptionDemo();
//因为该方法抛出的是运行时异常,即使不处理也不会发生编译错误
ed.division();
//该方法抛出的是检查时异常,要求开发者显示处理
//如果不处理则编译错误
//add.hello();
try {
//此处会抛出ArithmeticException
int i = 1/0;
}catch (ArithmeticException e) {
//catch语句块捕获了该异常
e.printStackTrace();
//若不处理异常,程序会中断,不会执行到这里
System.out.println("异常处理");
}
}
}