异常
定义
程序编译或者运行的不正常情况,是一种处理程序编译或运行时错误的机制。
异常处理机制的处理原理
当程序运行过程中出现异常的时候,java虚拟机会创建一个异常对象(throw 主动抛出),将其抛到调用栈中,使其沿着调用栈向上,直到在调用其方法的其他方法中的方法体内找到一个与之匹配的catch块。如果找到了匹配的catch块,就会执行该块中的代码,并继续执行程序。如果没有找到匹配的catch块,异常就会继续向上抛出(throw),直到被JVM的默认异常处理器(输出异常信息)处理为止。
常见异常
java.util.InputMismatchException | 输入类型不匹配 | |
---|---|---|
java.lang.ArrayIndexOutOfBoundsException | 数组越界异常 | |
java.NullPointerException | 空指针异常 | 调用空对象的方法 |
java.classCastException | 类型转化异常 | |
NumberFormatException | 数据类型转换异常 | |
ArithmeticException | 算数异常 |
try {
// 获取用户提交的数据
String input = request.getParameter("input");
// 对输入数据进行验证
if (input == null || input.equals("")) {
throw new Exception("输入不能为空");
}
if (!input.matches("\\d+")) {
throw new Exception("输入必须为数字");
}
int num = Integer.parseInt(input);
if (num < 0 || num > 100) {
throw new Exception("输入必须在0-100之间");
}
// 验证通过,执行相应的操作
// ...
} catch (Exception e) {
// 验证失败,捕获异常并进行相应的处理
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<script>alert('" + e.getMessage() + "');</script>");
// ...
}
在前端页面进行验证处理的时候,获取用户输入的数据,并对输入数据进行验证,抛出带有不同异常信息的异常,进行catch之后,可以生成一个提示框,并在提示框中添加相应的异常信息。
异常分类
编译型异常:没有继承runtimeException,编译时需要强制处理。util lang
运行型异常:继承了runtimeException,编译时不需要强制处理。test io net sql
runtimeException及其子类通常表示程序内部错误或逻辑错误,属于非检查异常,表明这类异常无需抛出或者强制捕获(不是很严重)
自定义异常
作用:构造出特定情况下需要的异常
public class 异常类名 extends Exception{
public 异常类名(String msg){
super(msg);
}
}
public void doSomething(){
try{
if(...){
// 说明此类异常符合该特定条件
throw new 异常类名("...");
}
}catch(...){
//输出异常信息
}
}
}
运行时异常的处理
1.异常机制:对运行时异常 不可取,常用程序逻辑的方式,一般要给一个非法值,供调用者识别,且一定要详细编辑文档注释(e g: return -1)
throw new 编译异常(...):必须声明throws 编译异常(抛出之后 必然有某处需要处理异常)
throw new 运行时异常(...):无需声明 可能在try中抛出多个运行时异常,在catch中考虑差异化处理(catch分支)或者统一处理,以统一处理为例,则可以调用某一方法对异常对象实现日志记录,发出服务器响应等等操作。有throw就必有try...catch,请务必注意抛出的运行时异常(无声明,易忽略)
用异常机制处理:throw new 异常类型(字符串拼接(IO 2))
try-catch的两种常见模板
1.多分支catch:便于进行差异化处理
try{ 异常代码:不确定是异常的代码不要放进去,逐行检索异常代码效率比较低 }catch(自己拋的异常 对象){ 对象.printStackTrace();(开发时用) }catch(别人(jdk/开发团队队友)抛出的异常 对象){ 对象.printStackTrace(); }catch(Exception e){ (解决隐性异常,无论是什么异常,从多态的角度都是Exception) e.printStackTrace(); }
2.使用异常多态:主要只是为了查看异常信息的内容
try{ ... }catch(Exception e){ e.printStackTrace(); }
6.finally的作用
常用于关闭资源、文件,数据库连接,日志记录,发送响应通知,执行清理操作等功能。
7.子类不能抛出比父类类型更大的异常(子类限制始终比父类更加严格)
IO 1
/**
*
* @param a 被除数(>=0)
* @param b 除数(>0)
* @return 当b不等于0时,返回a/b,当b等于0的时候,返回-1(返回-1的原因:a/b的结果一定是>=0的 出现负值就说明有异常)
*/
static float divide(int a,int b) throws Exception{
if(b == 0){
// 运行时异常return -1是比较安全的
// return -1;
// throw new ArithmeticException("除零异常");
throw new Exception("除零异常");//抛出异常的源头
}
return a*1.0f/b;
}
IO 2:
private static int []array = {
1,2,3,4};
static int get(int index){
if(index < 0 || index >= array.length){
throw new IndexOutOfBoundsException("下标越界异常(0~"+(array.length-1)+"):"+index);
}
else
return array[index];
}