异常详解,一文搞懂!

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 异常详解,一文搞懂!

异常

定义

程序编译或者运行的不正常情况,是一种处理程序编译或运行时错误的机制

异常处理机制的处理原理

当程序运行过程中出现异常的时候,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

  1. throw new 编译异常(...):必须声明throws 编译异常(抛出之后 必然有某处需要处理异常)
    throw new 运行时异常(...):无需声明 可能在try中抛出多个运行时异常,在catch中考虑差异化处理(catch分支)或者统一处理,以统一处理为例,则可以调用某一方法对异常对象实现日志记录,发出服务器响应等等操作。

  2. 有throw就必有try...catch,请务必注意抛出的运行时异常(无声明,易忽略)

  3. 用异常机制处理:throw new 异常类型(字符串拼接(IO 2))

  4. 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];
}
目录
相关文章
|
Java 编译器 程序员
【JavaSE专栏67】谈谈异常的那些事,学会预判异常、捕获异常、转移异常
【JavaSE专栏67】谈谈异常的那些事,学会预判异常、捕获异常、转移异常
【JavaSE专栏67】谈谈异常的那些事,学会预判异常、捕获异常、转移异常
|
1月前
|
Java
深入浅出Java异常处理机制
【9月更文挑战第37天】在Java编程的世界里,异常处理是一项基础而重要的技能。它就像是我们生活中的急救箱,遇到意外时能及时救治,避免程序崩溃。本文将通过生动的例子和易于理解的语言,带你了解Java中的异常处理机制,从基本的try-catch语句到自定义异常的创建,让你的程序更加健壮和可靠。准备好了吗?让我们一起走进Java异常处理的大门,探索它的奥秘吧!
|
6月前
|
Java 编译器 数据库连接
Java异常处理:深入解析与实践
Java异常处理:深入解析与实践
234 1
|
6月前
|
Java 编译器 API
Java异常探秘:从错误中学习
Java异常探秘:从错误中学习
43 0
Java异常探秘:从错误中学习
【面试题精讲】异常使用有哪些需要注意的地方?
【面试题精讲】异常使用有哪些需要注意的地方?
|
6月前
|
Java 数据库连接 开发工具
Java异常&反射常见面试题及答案
Java异常&反射常见面试题及答案
一文搞懂Go语言错误处理【异常捕获、异常抛出】
一文搞懂Go语言错误处理【异常捕获、异常抛出】
一文搞懂Go语言错误处理【异常捕获、异常抛出】
超详细的Java异常处理机制知识整理2
超详细的Java异常处理机制知识整理2
|
安全 Java 编译器
超详细的Java异常处理机制知识整理1
超详细的Java异常处理机制知识整理
170 0
如何处理JDK线程池内线程执行异常?讲得这么通俗,别还搞不懂
本篇 《如何处理 JDK 线程池内线程执行异常》 这篇文章适合哪些小伙伴阅读呢? 适合工作中使用线程池却不知异常的处理流程,以及不知如何正确处理抛出的异常