Java异常处理知识点与面试过关面试题(含答案)

!!!请各位准大厂员工一定不要杂乱无章的准备Java面试相关技术栈,详细最新最全面的技术栈思维导图,我已经为你准备好了:最新Java技术栈思维导图
Java 的异常处理机制通过提供结构化的错误处理方式,帮助开发者捕获和处理程序执行过程中可能出现的错误,确保代码的鲁棒性和健壮性。Java 使用异常类来表示程序中出现的错误,并提供了 try-catch-finally 块来进行异常处理。

1. 异常类的层次结构

在 Java 中,异常是类,继承自 java.lang.Throwable。根据异常的类型,它们被划分为两大类:

  • Error:表示严重的错误,通常是 JVM 相关的错误,如内存溢出(OutOfMemoryError)、栈溢出(StackOverflowError)。Error 通常无法恢复,也不应在代码中捕获。

  • Exception:表示程序中的可预见错误。Exception 是开发者通常处理的异常类型,又分为两类:

    • 受检异常(Checked Exception):必须在编译时进行处理或声明,比如 IOExceptionSQLException。如果方法可能抛出受检异常,必须使用 try-catch 处理或者在方法签名中使用 throws 关键字声明。
    • 非受检异常(Unchecked Exception):继承自 RuntimeException,通常是由于编程错误引起的,如 NullPointerExceptionArrayIndexOutOfBoundsException。非受检异常无需在编译时强制处理。
异常层次结构的示意图:
Throwable
   |
   |-- Error
   |    |-- OutOfMemoryError
   |    |-- StackOverflowError
   |
   |-- Exception
        |-- IOException
        |-- SQLException
        |-- RuntimeException
              |-- NullPointerException
              |-- IllegalArgumentException

2. 异常的捕获和处理 (try-catch-finally)

Java 提供了 try-catch-finally 语句来捕获和处理异常:

  • try:包含可能抛出异常的代码。
  • catch:捕获并处理在 try 块中抛出的异常。
  • finally:无论是否抛出异常,finally 块中的代码都会执行,通常用于释放资源。
try {
    // 可能抛出异常的代码
    int result = 10 / 0;
} catch (ArithmeticException e) {
    // 捕获并处理异常
    System.out.println("Cannot divide by zero.");
} finally {
    // 无论是否发生异常,都会执行
    System.out.println("This block is always executed.");
}
多个 catch 块:

可以在一个 try 块后使用多个 catch 块来处理不同类型的异常:

try {
    String text = null;
    System.out.println(text.length());
} catch (NullPointerException e) {
    System.out.println("NullPointerException caught.");
} catch (Exception e) {
    System.out.println("Other exceptions caught.");
}

3. throws 关键字

当一个方法可能抛出异常且不打算在方法内部处理时,可以使用 throws 关键字在方法声明中抛出该异常。调用该方法的代码需要处理这些异常。

public void readFile(String fileName) throws IOException {
    FileReader file = new FileReader(fileName);
    file.read();
}

调用者需要处理或继续抛出异常:

try {
    readFile("test.txt");
} catch (IOException e) {
    System.out.println("File not found.");
}

4. 自定义异常

开发者可以根据需求创建自定义的异常类,通常继承自 ExceptionRuntimeException

public class CustomException extends Exception {
    public CustomException(String message) {
        super(message);
    }
}

使用自定义异常:

public void validateAge(int age) throws CustomException {
    if (age < 18) {
        throw new CustomException("Age must be 18 or older.");
    }
}

5. try-with-resources 语句

Java 7 引入了 try-with-resources 语句,用于自动关闭实现了 AutoCloseable 接口的资源,避免手动释放资源的繁琐代码。常用于文件、数据库连接等需要关闭的资源。

try (FileReader file = new FileReader("test.txt")) {
    // 读取文件
} catch (IOException e) {
    e.printStackTrace();
}

try-with-resources 会自动调用 close() 方法来释放资源,即使发生异常。

6. 异常处理的最佳实践

  • 优先使用受检异常:对于业务逻辑中可预见的异常(如文件未找到、数据库连接失败),应使用受检异常并进行适当处理。
  • 捕获具体异常:避免使用过于泛泛的异常类(如 Exception),尽量捕获更具体的异常。
  • 在恰当的层级处理异常:异常应该在最适合的层级处理,而不是在过于底层的代码中盲目捕获所有异常。
  • 避免吞掉异常:在 catch 块中,如果只是打印异常,不应完全忽略它,应该记录日志或采取恢复措施。

7. 常见的异常类型

  • NullPointerException:当尝试访问空引用的对象时抛出。
  • ArrayIndexOutOfBoundsException:数组访问越界时抛出。
  • ArithmeticException:如除以零时抛出。
  • ClassNotFoundException:在类加载时找不到指定类时抛出。
  • IOException:与输入/输出相关的异常,常在文件操作或网络操作中出现。

总结

Java 的异常处理机制通过结构化的方式处理运行时错误,提供了灵活的方式来应对各种错误场景。掌握 try-catch-finallythrows 和自定义异常的使用方法,是开发健壮 Java 程序的关键。
Java异常处理是面试中常见的考察点,面试官通常会通过一些经典问题来测试候选人对异常处理的理解。以下是常见的面试题及其解答思路:

1. 什么是异常?Java 中异常的层次结构是怎样的?

解答思路:

  • 异常是程序执行过程中出现的错误或意外情况。
  • Java 中异常的根类是 java.lang.Throwable,它有两个主要子类:
    • Error:表示系统级错误,无法被应用程序处理。
    • Exception:表示可被程序处理的异常,分为受检异常(如 IOException)和非受检异常(如 NullPointerException)。

2. 受检异常(Checked Exception)和非受检异常(Unchecked Exception)的区别?

解答思路:

  • 受检异常:继承自 Exception,在编译时必须处理(通过 try-catchthrows)。
    • 例子:IOExceptionSQLException
  • 非受检异常:继承自 RuntimeException,编译时不强制处理,通常是编程错误引起的。
    • 例子:NullPointerExceptionIndexOutOfBoundsException

3. try-catch-finally 的工作原理是什么?

解答思路:

  • try:放置可能抛出异常的代码。
  • catch:捕获并处理特定类型的异常。
  • finally:无论是否发生异常,finally 块中的代码都会执行,常用于释放资源。
    • 如果在 trycatch 中使用 returnfinally 块依然会执行。

4. finally 块一定会执行吗?是否有例外情况?

解答思路:

  • 通常情况下,finally 块总是会执行,不论是否有异常。
  • 唯一的例外情况是:
    • trycatch 中调用了 System.exit(),强制退出 JVM。
    • 线程中断或被终止的情况。

5. 如何自定义异常?为什么需要自定义异常?

解答思路:

  • 自定义异常是通过继承 ExceptionRuntimeException 类来实现的,通常用于定义特定的业务异常。
  • 示例:
    public class CustomException extends Exception {
        public CustomException(String message) {
            super(message);
        }
    }
    
  • 自定义异常使得错误信息更加明确,方便定位问题并提高代码可读性。

6. throwthrows 的区别?

解答思路:

  • throw:用于显式抛出异常对象。
    throw new IllegalArgumentException("Invalid argument");
    
  • throws:用于方法声明,表示该方法可能抛出的异常。
    public void myMethod() throws IOException {
        // code
    }
    

7. try-with-resources 是什么?有什么优点?

解答思路:

  • try-with-resources 是 Java 7 引入的语法糖,用于简化资源管理。
  • 它要求在 try 中声明实现了 AutoCloseable 接口的资源,会自动在代码执行完后关闭资源。
  • 优点:
    • 避免资源泄露(如文件流、数据库连接)。
    • 自动调用 close() 方法,无需显式在 finally 块中关闭资源。

8. Java 中常见的运行时异常有哪些?

解答思路:

  • NullPointerException:当引用变量为 null 时尝试调用方法或访问成员。
  • ArrayIndexOutOfBoundsException:访问数组中不存在的索引。
  • ArithmeticException:执行非法数学操作,如除以零。
  • ClassCastException:在运行时尝试将对象转换为不兼容的类。
  • IllegalArgumentException:传递给方法的参数不合法。

9. 如何处理多个异常?

解答思路:

  • 使用多个 catch 块来分别捕获不同类型的异常。
  • Java 7 以后,可以使用单个 catch 块捕获多个异常,使用竖线 (|) 分隔异常类型:
    try {
        // code that may throw multiple exceptions
    } catch (IOException | SQLException e) {
        e.printStackTrace();
    }
    

10. 什么是异常链?如何使用?

解答思路:

  • 异常链(Exception Chaining)允许将一个异常封装为另一个异常的原因,以保持异常的上下文信息。
  • 使用 ThrowableinitCause() 方法或异常构造函数来设置原因异常:
    public class MyException extends Exception {
        public MyException(String message, Throwable cause) {
            super(message, cause);
        }
    }
    

11. Java 中如何记录异常?

解答思路:

  • 通常使用日志框架(如 Log4j、SLF4J)来记录异常。推荐使用 Logger 来记录异常栈信息:
    private static final Logger logger = LoggerFactory.getLogger(MyClass.class);
    
    try {
        // code
    } catch (Exception e) {
        logger.error("An error occurred", e);
    }
    

12. 受检异常和非受检异常,哪个更好?什么时候使用受检异常?

解答思路:

  • 受检异常在编译时强制处理,适用于业务逻辑中可能的异常情况,比如 I/O 操作、数据库访问等。
  • 非受检异常更适合编程错误,如 NullPointerException,不应强制处理。
  • 受检异常适用于那些程序有可能恢复的情况,而非受检异常多用于不可恢复的错误。

总结:

Java 异常处理的面试问题通常考察候选人对异常分类、捕获机制、自定义异常以及异常最佳实践的理解。掌握这些知识有助于应对面试中的常见问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/901989.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

anaconda jupyter notebook themes install jupyter notebook样式更改,取消页面头部,全屏展示!

现在已经有很多相关的文章了&#xff0c;我只说简单的解决步骤&#xff1a; 我用的是anaconda的 jupyter notebook&#xff0c;这个要更改主题&#xff0c;方法有&#xff1a; 一&#xff0c;最简单&#xff1a;用 jupyter notebook自带的setting>Theme>自己选&#xff1…

模型 是否树(逻辑树之三)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。决策分支&#xff0c;是与否的逻辑路径。 1 是否树的应用 1.1 个人IP打造中的是否树应用案例&#xff1a;社交媒体营销策略 在个人品牌建设中&#xff0c;是否树可以帮助个人识别关键的决策点&#…

纯GO语言开发RTSP流媒体服务器-RTSP推流直播、本地保存录像、录像回放、http-flv及hls协议分发

温馨提示&#xff1a;我们分享的文章是给需要的人&#xff0c;不需要的人请绕过&#xff0c;不知道为什么总有一些人总觉得我们发的文章是给他看的&#xff0c;我们不逼任何人用或了解&#xff0c;不要一来就攻击我们&#xff0c;我们不惹事但也不怕事&#xff01;也希望大家和…

springboot083基于springboot的个人理财系统--论文pf(论文+源码)_kaic

基于springboot的个人理财系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了个人理财系统的开发全过程。通过分析个人理财系统管理的不足&#xff0c;创建了一个计算机管理个人理财系统的方案。文章介绍了个…

Depcheck——专门用于检测 JavaScript 和 Node.js 项目中未使用依赖项的工具

文章目录 Depcheck 是什麽核心功能&#x1f4da;检测未使用的依赖&#x1f41b;检测缺失的依赖✨支持多种文件类型&#x1f30d;可扩展性 安装与使用1. 安装 Depcheck2. 使用 Depcheck Depcheck 的应用总结项目源码&#xff1a; Depcheck 是什麽 来看一个常见错误场景&#x1…

深入了解 Android 中的命名空间:`xmlns:tools` 和其他常见命名空间

在 Android 开发中&#xff0c;xmlns &#xff08;.xml的namespace&#xff09;命名空间是一个非常重要的概念。通过引入不同的命名空间&#xff0c;可以使用不同的属性来设计布局、设置工具属性或者支持自定义视图等。除了 xmlns:tools 以外&#xff0c;还有很多常见的命名空间…

故障诊断 | CNN-ResNets滚动轴承故障诊断实例代码

故障诊断 | CNN-ResNets滚动轴承故障诊断实例代码 目录 故障诊断 | CNN-ResNets滚动轴承故障诊断实例代码效果一览基本介绍程序设计参考资料 效果一览 基本介绍 CNN-ResNets&#xff08;卷积神经网络-残差网络&#xff09;在滚动轴承故障诊断中是一种常用的方法。这种方法利用…

VisionPro - 高级 - 保存模式以备后用 - 中心圆的查找配置

前言: 在基础篇, VisionPro Basic - 01- 有关应用和作业-CSDN博客 我们提到了应用和作业的保存,那么这些都是vpp的保存格式。 我们知道,在模式工具的配置中,如果我们做好了很多的调试,最后配置好参数后,也有一个保存模式的选项。我们在保存的时候,一定要添加前缀或…

Java多线程详解②(全程干货!!!)Thread Runnable

这里是Themberfue 上节主要讲完了多线程的一些基础知识&#xff0c;这节通过代码进一步理解多线程&#x1fae1; 多线程 Java标准库中提供了Thread类&#xff0c;以程序员们编写多线程代码&#xff0c;我们可以查看官方文档进一步了解Thread的特性以及提供的接口。 类似于Sy…

【ROS中的IMU惯性测量单元】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、IMU的部分关键数据解析二、常规IMU模块与九轴三、使用C实现获取IMU数据的节点1.IMU中的话题2.获取IMU数据程序设计思路3.获取IMU数据程操作步骤与实验现象&…

世界酒中国菜与另可数字平台达成战略合作

世界酒中国菜与另可数字平台达成战略合作&#xff0c;共推行业发展新高度 近日&#xff0c;在行业内引起广泛关注的“世界酒中国菜”项目&#xff0c;与“另可”数字平台成功举行了战略合作签约仪式。这一重要合作不仅是双方发展历程中的重要里程碑&#xff0c;更是继世界酒中…

Ubuntu 22.04系统启动时自动运行ROS2节点

在 Ubuntu 启动时自动运行 ROS2 节点的方法 环境&#xff1a;Ubuntu 系统&#xff0c;ROS2 Humble&#xff0c;使用系统自带的 启动应用程序 目标&#xff1a;在系统启动时自动运行指定的 ROS2 节点 效果展示 系统启动后&#xff0c;自动运行小乌龟节点和键盘控制节点。 实践…

川渝地区软件工程考研择校分析

C哥专业提供——计软考研院校选择分析专业课备考指南规划 通过最新数据分析,5所高校软件工程专业2025年考研难度从高到低预计为: 电子科技大学 >> 四川大学 > 重庆大学 ≈ 西南交通大学 > 西南大学 对于想考川渝地区985但核心目标为优先上岸的考生,建议重点考虑西…

SSM学习day01 JS基础语法

一、JS基础语法 跟java有点像&#xff0c;但是不用注明数据类型 使用var去声明变量 特点1&#xff1a;var关键字声明变量&#xff0c;是为全局变量&#xff0c;作用域很大。在一个代码块中定义的变量&#xff0c;在其他代码块里也能使用 特点2&#xff1a;可以重复定义&#…

【玩儿】Java 数字炸弹小游戏(控制台版)+ IO 数据存储

Java 数字炸弹小游戏&#xff08;控制台版&#xff09; IO 数据存储 数字炸弹小游戏概述功能实现实体类User.java 玩家信息实体类GameRecode.java 游戏记录实体类 自定义异常AccountLockedException.java 账号锁定异常PasswordErrorException.java 密码错误异常UnknowAccountEx…

解决JeecgBoot微服务通过Gateway访问Swagger资源出现“Knife4j文档请求异常”

1.问题描述 基于jeecgboot单体版本,参照官方推荐的纯微服务项目拆分指南,对jeecgboot项目进行微服务拆分,将gateway和system模块启动成功后,通过gateway访问访问Swagger接口文档,出现“Knife4j文档请求异常”,如下图: 2.问题定位: 1.浏览器F12打开控制台,查看异常请…

RPKI路由应急管控系统---软件著作

RPKI路由应急管控系统V2.0 说明书 1.引言 1.1产品描述 软件名称&#xff1a;RPKI路由应急管控系统V2.0 简称&#xff1a;RPKI - QCL-V2.0 开发语言&#xff1a;Rust、Python、HTML、CSS、TypeScript 功能版本&#xff1a;V2.0 1.2开发背景及内容提要 随着互联网的快速发展…

gin入门教程(7): 使用 Logrus + Lumberjack 创建日志中间件

结合 Logrus 和 Lumberjack&#xff0c;可以创建一个高效的日志中间件&#xff0c;用于记录请求和响应。以下是实现步骤&#xff1a; 1. 安装依赖 首先&#xff0c;确保安装了 Logrus 和 Lumberjack&#xff1a; go get github.com/sirupsen/logrus go get gopkg.in/natefin…

基于Python大数据的王者荣耀战队数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

SpringBoot中yaml配置文件中文字符异常以及将多个独立的IDEA项目整合到一个项目里当做模块的处理

一、SpringBoot中yaml配置文件中文字符异常 在使用 SpringBoot 中 yaml 配置注入实体类中时&#xff0c;怎么注入都不成功&#xff0c;注入类的数据 yaml 如下。 schools:name: kermitgrades: 7students: 2050address: "中国北京" 报错如下&#xff1a; java.lang.I…