javase异常的捕获与抛出以及自定义异常
异常
1.error和exception
软件在运行过程中,可能出现的意外问题,比如被除数做0,递归中没有递归头,陷入循环……
检查性异常
用户错误或者问题引起的异常,这些程序员无法预料的。
运行时异常
运行时异常是可能被程序员避免的异常,与检查性异常相反,运行时异常可以在编译时被忽略。
错误
错误不是异常,而是脱离程序员控制的问题,错误在代码中通常被忽略,例如,栈溢出,这是在编译时也检查不到的。
在java中会把异常当做对象处理,所有异常就分为error和exception,error一般是无法预料到的异常,exception一般是可以预料或者在编译的时候就会报出来的异常。
2.捕获和抛出异常
异常处理五个关键字:try ,catch,throw,throws,finally
try,catch,finally经常是配合使用的!!
package com.javase.exception;
/**
* @author panglili
* @create 2022-07-14-9:49
*/
public class ExceptionTest {
public static void main(String[] args) {
int a=1;
int b=0;
try{ //监控区域
System.out.println(a/b);
}catch(ArithmeticException e){
//监控到异常后处理办法
System.out.println("程序异常!");
}finally{
//有没有异常都会执行的
System.out.println("finally执行了");
}
}
}
throw手动抛出异常;
package com.javase.exception;
/**
* @author panglili
* @create 2022-07-14-9:59
*/
public class ExceptionThrow {
public static void main(String[] args) {
ExceptionThrow.test(1,0);
//预知到可能出现的异常后,手动抛出
}
public static void test(int a,int b){
if(b==0){
//一般用在方法中,即使此刻没有计算也会因为b=0而抛出异常
throw new ArithmeticException();
}
}
}
throws假如此时方法不能处理异常就在方法头上继续向上抛出!
public static void test(int a,int b)throws ArithmeticException {
if(b==0){
//一般用在方法中,即使此刻没有计算也会因为b=0而抛出异常
throw new ArithmeticException();
}
抛出之后还是需要try,catch去捕获!
3.自定义异常
用户自定义异常只需要继承exception类即可。
package com.javase.exception;
/**
* @author panglili
* @create 2022-07-14-10:08
*/
public class MyException extends Exception {
//传递数字大于10就去抛出异常
private int detail;
public MyException(int a){
this.detail=a;
}
//重写父类打印异常的信息
@Override
public String toString() {
return "myexception";
}
}
package com.javase.exception;
/**
* @author panglili
* @create 2022-07-14-10:14
*/
public class Test {
//可能存在的异常
public static void test(int a) throws MyException{
if(a>10){
throw new MyException(a);
}
System.out.println("ok");
}
public static void main(String[] args) {
try {
test(1);
} catch (MyException e) {
e.toString();
e.printStackTrace();
}
}
}