1.异常的继承类结构:
(1)所有的异常都是由Throwable继承下来,它的两个子类为Error和Exception。
(2)Error类描述了Java运行时的内部错误和资源耗尽错误。
Error类常见异常:OOM、StackOverFlow Error
(3)Exception及其子类:
IOException:程序本身没有问题,I/O异常(打开一个不存在的文件)
RuntimeException:程序出错
(4)受查异常:必须强制用户进行异常处理。
(5)非受查异常:不强制进行异常处理(Error、RuntimeException及其子类)
2.异常的影响:
(1)异常是导致程序中断的一种指令流。程序之中如果出现异常并且没有合理处理的话就会导致程序终止运行。
(2)异常语句产生之前的语句可以正常执行完毕,异常产生之后的程序直接结束,不会继续执行。
3.异常处理格式:
(1)为了保证程序出现异常之后还可以继续向下执行,就需要异常处理。
(2)语法格式如下:
try{
// 有可能出现异常的语句;
}catch(异常类 对象){
// 出现异常之后的具体操作;
}finally{
// 异常的出口;
}
(3)三种结构:
try…catch结构
try…finally结构
try…catch…finally结构
(4)注意事项:
- try代码块负责判断是否有异常产生,若无,执行语句;若有,不执行该语句
- catch代码块负责捕获异常并处理异常,通常格式:catch(Exception e)
- catch代码块中若要进行完整异常信息的输出,用e.printStackTrace()方法
- 若catch捕获异常时,没有捕获指定异常,就使用多个catch捕获异常
- finally代码块是异常的出口,无论是否产生异常,finally代码块都会执行
- 若try或catch块中有return语句,在执行return之前一定会先执行finally代码块
4.throws关键字:
(1)throws用在方法上,用来告诉调用者这个方法可能产生哪些异常,但方法本身不处理,将异常抛回给调用方。
(2)如果调用throws声明的方法,在调用时必须明确使用try…catch语句进行捕获。
(3)主方法也可以使用throws进行异常抛出,若产生异常交给JVM处理。
5.throw关键字:
(1)throw使用在方法体代码中,表示人为进行异常的抛出。
(2)如果希望自己产生异常类对象而非由JVM产生,就可以在代码块中使用throw来抛出异常(一般与分支语句搭配使用来抛出自定义异常)。
(3)自定义异常:用户可继承Exception或RuntimeException来实现自定义异常。
6.异常处理标准模式:
public static void main(String[] args){
try{
System.out.println(jisuan(10,0));
}catch(Exception e){
e.printStackTrace();
}
}
public static int jisuan(int x,int y) throws Exception{ //告诉用户此方法存在哪种异常
int result = 0;
System.out.println("****计算开始****");
try{
result = x/y;
}catch(Exception e){
throw e;
}finally{
System.out.println("####计算结束####");
}
return result;
}
7.自定义异常类:
(1)自定义异常类可以继承两种父类:Exception、RuntimeException
(2)自定义异常类的实现:
class AddException extends Exception{ //自定义异常类
public AddException(String s){
super(s);
}
}
public class Day18{
public static void main(String[] args) throws Exception{ //throws声明主方法,告诉主方法产生了哪种异常
int num1 = 20;
int num2 = 30;
if(num1+num2 == 50){
throw new AddException("错误的相加操作"); //调用构造方法抛出异常
}
}