第七章 异常
异常
a.在运行时出现的意外错误称为“异常”
b.对异常的处理机制也成为判断一种语言是否成熟的标准。
c.活动异常处理是程序员更容易写出健壮的代码,防止代码中BUG的蔓延
异常类分两种:1.错误(error),一般指与虚拟机相关的问题 ;2.异常(Exception),指因编程错误或者外在因素导致的问题,同时又能被系统捕获并进行处理,从而避免的。
从编程角度分两种:1.非检查型异常;2.检查型异常
java提供处理异常的机制有两种:
a.使用try…catch捕获异常;将可能产生异常的代码块放进try语句进行隔离,如果遇到异常,程序会停止try块的代码,跳到catch块中进行处理。
1.try catch finally语句处理
格式:
try
{
//需要被检测的代码;
}
catch(异常类 变量)
{
//处理异常的代码;(处理方式)
}
finally
{
//一定会执行的语句;
}
复制代码
b.使用throws声明抛出异常;不知道如何处理异常时,该异常应由上一级调用者进行处理,可在定义throws声明抛出异常。 throw是方法内抛出异常对象,而且每次只抛出一个异常实例对象; throws是方法声明时抛出异常序列
class Model{
public static void main(String[]args){
try{
div(5,0);//可能发生异常的语句
}catch(Exception e){
System.out.println("除数不能是零");//对异常捕获之后的处理
e.printStackTrace();
}finally{
System.out.println("over");//无论是否发生异常最终都会执行的语句,除了在前面出现程序结束的情况,例如System.exit();退出程序
}
}
public static int div(int a,int b)throws Exception{//此处对内部可能出现的异常进行声明抛出,由调用者进行处理
return a/b;
}
}
自定义异常
为什么要使用自定义异常,有什么好处?
1.我们在工作的时候,项目是分模块或者分功能开发的 ,基本不会你一个人开发一整个项目,使用自定义异常类就统一了对外异常展示的方式。
2.有时候我们遇到某些校验或者问题时,需要直接结束掉当前的请求,这时便可以通过抛出自定义异常来结束,如果你项目中使用了SpringMVC比较新的版本的话有控制器增强,可以通过@ControllerAdvice注解写一个控制器增强类来拦截自定义的异常并响应给前端相应的信息(关于springMVC控制器增强的知识有空再和大家分享)。
3.自定义异常可以在我们项目中某些特殊的业务逻辑时抛出异常,比如”中性”.equals(sex),性别等于中性时我们要抛出异常,而Java是不会有这种异常的。系统中有些错误是符合Java语法的,但不符合我们项目的业务逻辑。
4.使用自定义异常继承相关的异常来抛出处理后的异常信息可以隐藏底层的异常,这样更安全,异常信息也更加的直观。自定义异常可以抛出我们自己想要抛出的信息,可以通过抛出的信息区分异常发生的位置,根据异常名我们就可以知道哪里有异常,根据异常提示信息进行程序修改。比如空指针异常NullPointException,我们可以抛出 信息为“xxx为空”定位异常位置,而不用输出堆栈信息。
自定义异常需要继承Exception类
在 Java 中你可以自定义异常。编写自己的异常类时需要记住下面的几点。
所有异常都必须是 Throwable 的子类。
如果希望写一个检查性异常类,则需要继承 Exception 类。
如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。
代码:
//自定义异常类
public classs AgeException extends Exception{
public AgeException(){
}
public AgeExcetion(String msg){
super(msg)
}
}
//验证方法类
public class MyException{
public static void main (String args){
try{
Scanner sc=new Scanner(System.in);
System.out.println("请你的输入年龄:");
int age=sc.nextInt();
if(age<0||age>100){
throw new AgeException("请输入合理的年龄!!!");
}
catch(Exception e){
e.printStackTrace();
}
}
}