一、一般结构
public class Test{
try{
//可能发生异常的代码块
}
catch(Exceptiontype e) {
// 对Exception e的处理,Exception是异常变量类型,e是变量名
}
catch(Exceptiontype e2){
// ……
}
Finally{
//无论try中的代码如何退出,都将执行finally块
}
}
(1)处理过程:程序先执行try语句块,如果try语句块有异常,将执行catch语句块,执行完catch语句块后,直接执行后面语句,不会再执行try语句中异常后面的代码。
(2)catch中常用函数有(通过e.函数名调用):
getMessage():输出错误性质
toString():给出异常的类型与性质
printStackTrace():给出异常的类型、性质栈层次以及出现在程序的位置
(3)一般情况下,无论try中代码返回如何,都将执行finally语句块,以下情况,将不会执行finally语句块:
finally语句块发生异常
前面的代码使用System.exit()退出程序
程序所在线程死亡
关闭CPU
(4)关于多个catch的使用的说明:多个catch的关系类似“或”的关系,try捕捉到什么异常就跳转到对应的catch语句中(根据catch后面的参数决定),不会执行无关的catch异常;正因为如此,多个catch之间是有一定的顺序要求的:越是上层级的类,越要放到后面,如果上层级的异常类放到最前面,后面的具体类(子类)将永远执行不了。
二、自定义异常
自定义异常一般步骤:
(1)创建自定义异常类(继承Exception类),构造方法中继承父类构造方法,异常类的构造器可接受字符串作为参数,如:
public class MyException extends Exception() { //继承至Exception类
Public MyException(String ErroMessage){
Super(ErroMessage) //父类构造方法
}
}
(2) 定义方法时候,通过throws抛出自定义异常(throws在方法参数后面);在方法中,通过throw关键字,抛出自定义异常对象
(3)通过try……catch处理异常
代码如下:
import java.util.Scanner;
public class ExceptionTest {
public static int avg (int m,int n) throws MyException{
if(m>100||n>100){
throw new MyException("m或n值超过100");
}
if(m<0||n<0){
throw new MyException("m或n值小于0");
}
return (m+n)/2;
}
public static void main(String[] args){
try{
Scanner m=new Scanner(System.in);
System.out.println("请输入第一个数");
int a=m.nextInt();
System.out.println("请输入第二个数");
int b=m.nextInt();
avg(a,b);
}
catch(MyException e){
e.printStackTrace();
}
}
}
三、在方法中抛出异常
某个方法发生异常,但不想在该方法中处理异常时,可以使用throws、throw抛出异常,
throws | throw |
方法申明中,且位于参数括号后面,多个异常用逗号分隔 | 方法体中 |
抛出异常类(类似继承,后面直接加类名) | 抛出为异常对象,throw的异常必须要用try……catch捕捉 |
四、异常的分类
error用来描述java运行系统内部的错误以及资源耗尽的错误,这类错误比较严重;
exception类称为非致命类,可通过捕捉,使程序继续执行。
五、异常使用原则
(1)在当前方法中,使用try……catch语句
(2)一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类
(3)如果父类抛出多个异常,那么子类继承至父类的的方法,抛出的异常必须是父类异常的一个子集