异常处理概述
举个例子:除〇问题
public class QuotientWithException {
public static int quotient(int number1, int number2) {
if (number2 == 0)
throw new ArithmeticException("Divisor cannot be zero");
return number1 / number2;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Enter two integers: ");
int number1 = input.nextInt();
int number2 = input.nextInt();
try {
int result = quotient(number1, number2);
System.out.println(number1 + " / " + number2 + " is " + result);
} catch (ArithmeticException e) {
System.out.println("Exception: an integer cannot be dicided by zero ");
}
System.out.println("Execution continue ... ");
}
}
异常处理调用方法包含在一个try块和一个catch块中,try中包含正常的代码,异常被catch捕获,catch中的代码处理异常,之后执行catch之后的语句,不返回到throw语句。
异常类型
上图列出部分异常,Java定义的异常巨多无比,此处只是了解,不详述
异常可以分为三类:系统错误、异常、运行时异常。
系统错误(system error)是由Java虚拟机抛出的,用error类表示,如果发生,除了通知用户以及尽量稳妥地终止程序外,几乎什么也不能做。描述的是内部系统错误,很少发生。
异常(exception)是用Exception类表示的,描述的是由程序和外部环境所引起的错误,这些错误能被程序捕获和处理。
运行时异常(runtime exception)是用RuntimeException类表示的,通常由Java虚拟机抛出,描述的是程序设计错误。
RuntimeException、error以及它们的子类称为免检异常。其他所有异常称为必检异常,编译器会强制程序员检查并通过try-catch块处理他们,或者在方法头进行声明。
异常处理的三个操作
声明、抛出、捕获
声明异常:每个方法都必须声明它可能会抛出的必检异常的类型。但不要求显式声明免检异常。
方法要抛出的其他异常都必须在方法头中显示声明,使用 throws,如下所示:
public void myMethod() throws IOException,Exception1, ...,ExceptionN
如果方法没有在父类中声明异常,那么就不能在子类中对其进行继承来声明异常。
抛出异常:检测到错误的程序可以创建一个合适的异常类型的实例,并抛出它。使用throw。如下所示:
IllegalArgumentException ex = new IllegalArgumentException("Wrong Argument");
throw ex;
或者根据偏好,使用下面的语句:
throw new IllegalArgumentException("Wrong Argument");
捕获异常:寻找处理器的过程。处理这个异常的代码称为异常处理器。
finally子句
无论异常是否发生,finally子句总是会被执行。即使在到达finally块之前有一个return语句,finally块还是会执行。
try{
statements;
}
catch(TheException ex){
handling ex;
}
finally{
finalStatements;
}
重新抛出异常
如果异常处理器不能处理一个异常,或者只是简单地希望调用者注意到该异常,Java允许该异常处理器重新抛出异常。
try{
statements;
}
catch(TheException ex){
perform operations before exits;
throw ex;
}