Java一分钟之——异常分类:检查异常与运行时异常

简介: 【5月更文挑战第20天】Java异常处理分为检查异常(Checked Exceptions)和运行时异常(Unchecked Exceptions),两者在编译期处理方式不同。检查异常需捕获或声明,如`IOException`,而运行时异常如`NullPointerException`在运行时终止程序。常见问题包括不恰当的异常使用、过度捕获和忽略异常信息。避免策略包括正确区分异常类型、具体捕获和处理异常信息。示例代码展示了如何处理这两种类型的异常。理解并妥善处理异常能提升程序的健壮性和可维护性。

在Java编程中,异常处理是确保程序健壮性的重要手段。Java异常分为两大类:检查异常(Checked Exceptions)和运行时异常(Unchecked Exceptions)。理解这两者的区别对于编写稳定、可维护的代码至关重要。本文将探讨这两类异常的基本概念、常见问题、易错点及避免策略,并通过代码示例加以说明。
image.png

异常分类

检查异常(Checked Exceptions)

  • 特点:在编译期间,Java要求必须捕获或声明这些异常。它们通常表示可恢复的错误,如文件不存在、网络中断等。
  • 例子IOExceptionSQLExceptionClassNotFoundException等。
  • 处理方式:使用try-catch块捕获,或者在方法签名中声明throws异常。

运行时异常(Unchecked Exceptions)

  • 特点:这些异常在编译时不强制要求捕获或声明,但在运行时如果发生,程序会终止。它们通常是编程错误或逻辑错误的结果。
  • 例子NullPointerExceptionArrayIndexOutOfBoundsExceptionIllegalArgumentException等。
  • 处理方式:虽然编译器不要求,但为了程序健壮性,通常还是建议捕获并处理。

常见问题与易错点

  1. 不恰当的异常使用:将运行时异常用作业务逻辑错误,或者忽略检查异常的处理。
  2. 过度使用catch (Exception e) :捕获所有异常可能导致错误难以定位,应尽可能具体地捕获异常。
  3. 忽略异常信息:在捕获异常后,不记录或报告异常信息,导致调试困难。

避免策略

  • 正确区分异常类型:检查异常用于可恢复的错误,运行时异常用于编程错误。避免将运行时异常用于业务逻辑。
  • 具体捕获异常:避免使用catch (Exception e),而是尽量捕获具体的异常类型,以便更精确地处理。
  • 处理异常信息:捕获异常时,记录异常信息,包括堆栈跟踪,便于调试和问题分析。

代码示例

public class ExceptionClassificationExample {
   
   
    public static void main(String[] args) {
   
   
        try {
   
   
            readFile("nonexistent.txt"); // 检查异常
            divideByZero(5, 0); // 运行时异常
        } catch (FileNotFoundException e) {
   
   
            System.out.println("File not found: " + e.getMessage());
        } catch (ArithmeticException e) {
   
   
            System.out.println("Division by zero: " + e.getMessage());
        }
    }

    public static void readFile(String fileName) throws FileNotFoundException {
   
   
        // 实际读取文件的逻辑
    }

    public static int divideByZero(int a, int b) {
   
   
        if (b == 0) {
   
   
            throw new ArithmeticException("Cannot divide by zero");
        }
        return a / b;
    }
}

在这个例子中,readFile()方法抛出FileNotFoundException,这是一个检查异常,需要在调用者处处理。divideByZero()方法抛出ArithmeticException,这是一个运行时异常,虽然编译器不需要强制捕获,但为了健壮性,我们仍然捕获并处理。

总结

了解并正确处理检查异常和运行时异常是Java编程的关键。通过理解它们的区别,我们可以编写出更健壮的代码,有效地处理错误,并在出现问题时迅速定位和修复。在编写代码时,要注意异常的分类,避免不恰当的异常使用,具体捕获异常,并妥善处理异常信息。

目录
相关文章
|
6月前
|
机器学习/深度学习 分布式计算 Java
Java 大视界 -- Java 大数据机器学习模型在遥感图像土地利用分类中的优化与应用(199)
本文探讨了Java大数据与机器学习模型在遥感图像土地利用分类中的优化与应用。面对传统方法效率低、精度差的问题,结合Hadoop、Spark与深度学习框架,实现了高效、精准的分类。通过实际案例展示了Java在数据处理、模型融合与参数调优中的强大能力,推动遥感图像分类迈向新高度。
|
7月前
|
Java 程序员 数据库连接
我们详细地讲解一下 Java 异常及要如何处理
我是小假 期待与你的下一次相遇 ~
163 1
|
10月前
|
SQL druid Oracle
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
|
10月前
|
SQL Java 中间件
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
在BeetISQL 2.13.8版本中,客户使用batch insert向yashandb表插入数据并尝试获取自动生成的sequence id时,出现类型转换异常。原因是beetlsql在prepareStatement时未指定返回列,导致yashan JDBC驱动返回rowid(字符串),与Java Bean中的数字类型tid不匹配。此问题影响业务流程,使无法正确获取sequence id。解决方法包括:1) 在batchInsert时不返回自动生成的sequence id;2) 升级至BeetISQL 3,其已修正该问题。
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
|
11月前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
668 14
|
11月前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
2187 5
|
11月前
|
前端开发 JavaScript Java
Java打包jar运行时分离lib和jar
在`pom.xml`的`build`节点中,设置`packaging`为`jar`,并配置插件分离依赖库到`lib`目录和资源文件到`resources`目录。这样可以在运行时通过`-Dloader.path=lib,resources`加载外部依赖和资源文件,便于独立升级依赖库和修改资源文件,而无需重新打包程序。具体插件包括`maven-dependency-plugin`、`maven-resources-plugin`和`spring-boot-maven-plugin`等。
647 1
|
12月前
|
缓存 Java 开发者
Java字面量详解:概念、分类与使用实例
本文介绍了Java字面量的概念、分类及应用。
504 11
|
Java 数据安全/隐私保护 C++
Java关键字大全(关键字分类详解)
Java关键字是预先定义的具有特别意义的标识符,也可以叫Java保留字,Java关键字不能用作变量名、方法名、类名、包名和参数,码笔记分享Java关键字大全: Java关键字大全 码笔记将Java关键字进行分类,并将Java关键字含义整理成表,如下表所示: Java关键字类别 Java关键字 .
2662 0
|
3月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
213 1