异常
概念
在程序中的一些突发情况,导致程序崩溃
分类
![img](https://i-blog.csdnimg.cn/blog_migrate/7ebfa5b1d43ad6d2fd15ea38f29dd28c.png)
Throwable
Throwable是父类,Exception和Error都继承了该类
所以在捕捉异常和错误的时候,也可以使用Throwable进行捕捉
错误 Error
因为硬件问题导致的程序崩溃
处理方案:软化开发工程师不需要处理
异常 Exception
检查时异常 CheckedException
因为程序中语法出现的问题
处理方案:将语法修改正确
运行时异常: RuntimeException
因为软化开发工程师在编写程序时,思路问题导致的程序崩溃
处理方法:将思路捋顺并修改正确,思路正确但是因为所需的外部内容存在问题,需要容错
常见异常
IndexOutOfBoundsException:数组下标越界异常
NullPointerException:空指针异常
ClassCastException:类型转换异常
ArithmeticException:算法异常
异常的传递
如果一个异常没有被捕获的话,它将会从调用栈顶被抛出。它会沿着调用栈往下传递给之前的方法。如果在这也没有被捕获的话,这个异常就会继续往下传递给这个方法之前的方法。这样向下传递直到这个异常被捕获或者到达调用栈的最低层。这就是异常的传递。
举例:
public class TestExceptionPropagation1{
void m(){
int data=50/0;
}
void n(){
m();
}
void p(){
try{
n();
}catch(Exception e){System.out.println("exception handled");}
}
public static void main(String args[]){
TestExceptionPropagation1 obj=new TestExceptionPropagation1();
obj.p();
System.out.println("normal flow...");
}
}
输出:
exception handled
normal flow..
异常发生在 m() 方法中,但是 m()方法中未处理,因此它传递给之前的 n() 方法,也没有被处理。再一次传递给之前的 p() 方法,在 p()方法中被处理。
异常处理
方案1:throws 声明异常
语法:
访问权限修饰符 修饰符 返回值类型 方法名() throws 异常{
}
方案2:try catch 处理异常
语法:
try{
有可能出现问题的代码
}catch(出现的问题类型1 变量名){
处理方案1
}catch(出现的问题类型2 变量名){
处理方案2
}
...
catch(出现的问题类型n 变量名){
处理方案n
}finally{
必须执行的代码
}
注意:
1,try 中如果出现问题,那么出现问题的代码后的代码将不在被执行
2,catch 中异常的类型必须先处理子类,在处理父类
3,finally 中的代码是必须执行的
方案3:throw抛出异常
语法:
访问权限修饰符 修饰符 返回值类型 方法名() throws 异常{
xxx
throw new 异常类型();
xxx
}
注意:
throw与throws的区别:
1,throw表示抛出异常,throws表示声明异常
2,throw在方法中使用,throws表示定义方法的形参列表后,方法体前使用
自定义异常
1,创建一个类使其继承与异常类
2,重写构造函数,调用父类构造函数