本文主要介绍了java中异常的相关知识,主要包括异常概念、异常分类、常见异常、异常的传递、异常处理、以及自定义异常!
异常
(1)概念
在程序中的一些突发情况,导致程序崩溃
(2)分类
Throwable
错误 Error
- 因为硬件问题导致的程序崩溃
处理方案:软化开发工程师不需要处理
异常 Exception
- 检查时异常 CheckedException
因为程序中语法出现的问题
处理方案:将语法修改正确- 运行时异常: RuntimeException
因为软化开发工程师在编写程序时,思路问题导致的程序崩溃
处理方法:将思路捋顺并修改正确,思路正确但是因为所需的外部内容存在问题,需要容错
(3)常见异常
IndexOutOfBoundsException:数组下标越界异常
NullPointerException:空指针异常
ClassCastException:类型转换异常
ArithmeticException:算法异常
(4)异常的传递
如果一个异常没有被捕获的话,它将会从调用栈顶被抛出。它会沿着调用栈往下传递给之前的方法。如果在这也没有被捕获的话,这个异常就会继续往下传递给这个方法之前的方法。这样向下传递直到这个异常被捕获或者到达调用栈的最低层。这就是异常的传递。
- 在程序运行时,某一处出现运行时异常,通常会引发一系列的连带异常(若某处异常在程序中被调用,调用处也会出现异常),但通常第一条才是真正的出现错误处
eg:
public class Test {
public static void main(String[] args) {
fun01();
}
public static void fun01() {
fun02();
}
public static void fun02() {
int num=10/0;
}
}
(5)异常处理
throw与throws的区别:
- throw表示抛出异常,throws表示声明异常
- throw在方法中使用,throws表示定义方法的形参列表后,方法体前使用
方案1:throws声明异常
语法:
访问权限修饰符 修饰符 返回值类型 方法名() throws 异常{
}
方案2:try catch处理异常
语法:
try{
有可能出现问题的代码
}catch(出现的问题类型1 变量名){
处理方案1
}catch(出现的问题类型2 变量名){
处理方案2
}
...
catch(出现的问题类型n 变量名){
处理方案n
}finally{
必须执行的代码
}
注意:
1,try中如果出现问题,那么出现问题的代码后的代码将不在被执行
2,catch中异常的类型必须先处理子类,在处理父类
3,finally中的代码是必须执行的(就算try中代码出现异常,finally中的代码也会执行
方案3:throw抛出异常
语法:
访问权限修饰符 修饰符 返回值类型 方法名() throws 异常{
xxx
throw new 异常类型();
xxx
}
(6)自定义异常
1,创建一个类使其继承与异常类
2,重写构造函数,调用父类构造函数
1.自定义异常:
public class MyException extends Exception {
public MyException() {
super("除数不能为0!");
}
}
2.测试程序:
public class Demo02 {
//除法
public static void divide(int num01,int num02) throws MyException{
if (num02==0) {
throw new MyException();
}
System.out.println(num01/num02);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
divide(10, 2);
} catch (MyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}