什么是异常:
概念:程序在运行中出现的特殊情况。
异常处理的必要性:任何程序都可能存在大量的未知问题、错误;如果不对这些问题进行正确处理,则可能导致程序的中断,造成不必要的损失。
异常的分类:
Throwable:可抛出的,一切错误或异常的父类,位于java.lang包中。
1.Error:JVM、硬件、执行逻辑错误,不能手动处理。
2.Exception:程序在运行时和配置中产生的问题,可处理。
(1)RuntimeException:运行时异常,可处理,可不处理。
可处理也可不处理,无需声明异常。
(2)CheckedException:受查异常,必须处理。
用Throws声明异常,修饰在方法参数列表后端
异常的产生:
1.自动抛出异常:当程序在运行时遇到不符合规范的代码或结果时,会产生异常。
2.手动抛出异常:语法:throw new 异常类型(“实际参数”);
3.产生异常结果:相当于遇到return语句,导致程序因异常而终止。
常见的异常处理方式:
try{
可能异常的代码
}catch(Exception e){
处理异常的相关代码。
}finally{
无论是否出现异常都执行。
}
常见的处理结构:多重catch();try{} finally{}
多重catch,遵循从小到大的顺序,父类异常在最后。
自定义异常:
需继承自Exception或Exception的子类,常用RuntimeException。
无参数构造方法
String message参数的构造方法
方法覆盖:
带有异常声明的方法覆盖:
方法名、参数列表、返回值类型必须和父类相同。
子类的访问修饰符和父类相同或是比父类更宽。
子类中的方法,不能抛出比父类更宽的异常,但可以比父类抛出更多的异常(前提是抛出的异常小于或等于父类异常级别)。
案例:
package com.Ch10.t1;
public class TestMyWork {
public static void main(String[] args)throws MyException2 {
int n;
try{
m(2);
}catch(MyException1 ex1){
//输出ex1详细方法调用栈信息
ex1.printStackTrace();
}catch(MyException2 ex2){
//输出ex2的详细信息
//把ex2重新抛出
ex2.printStackTrace();
throw ex2;
}
} //声明抛出M有Exception1
public static void m(int n)throws MyException1,MyException2{
if(n==1){
//抛出MyException1,并设定详细信息为"n==1"
throw new MyException1("n==1");
}else{
//抛出MyException1,并设定详细信息为"n==2"
throw new MyException2("n==2");
}
}
}
//受查时异常
class MyException1 extends Exception{
public MyException1(){}
public MyException1(String message){
super(message);
}
}
//运行时异常
class MyException2 extends RuntimeException{
public MyException2(){}
public MyException2(String message){
super(message);
}
}