Java基础面试题09:Java异常处理完成以后,Exception对象会发生什么变化?

一、Java异常(Exception)基本概念

什么是异常?

简单来说,异常就是程序运行时发生了意外的"错误"或者"不正常现象",导致程序中断。异常处理的目标是让程序在出现问题时能稳住,不会直接崩溃。

1.1 异常的分类

Java中的异常分为两大类:错误 (Error)异常 (Exception)

  • 错误 (Error):

    通常由硬件或操作系统问题引起,Java程序无法解决。例如:内存不足(OutOfMemoryError)。

  • 异常 (Exception):

    包括两种:

    • 运行时异常 (RuntimeException):
      这类问题可以不处理(程序不会强制要求),但最好避免。例如:
      • ArithmeticException:除数为零。
      • ArrayIndexOutOfBoundsException:数组越界。
      • NullPointerException:对象为空时调用方法。
    • 一般异常 (Checked Exception):
      必须处理,否则程序无法编译。例如:
      • IOException:输入输出错误。
      • ClassNotFoundException:类或接口找不到。

1.2 异常的处理方法

处理异常有两种主要方式:

  1. 直接处理:
    try...catch块捕获并处理异常,或在finally中清理资源。
  2. 抛出异常:
    将异常交给调用方法的"上一层"去处理。使用throwthrows关键字完成。

二、异常捕获和处理

2.1 try/catch捕获异常

try...catch类似于"保险计划"。当程序执行到try块时,如果一切正常,就跳过catch块。如果有异常,程序会直接跳转到相应的catch块处理问题。

java 复制代码
try {
    // 可能出问题的代码
} catch (异常类型 e) {
    // 如果发生了指定类型的异常,就执行这里的代码
} finally {
    // 无论是否发生异常,这里的代码总会执行(比如释放资源)
}

示例代码

假设我们访问数组中的某些元素,可能会发生数组越界异常

java 复制代码
try {
    String[] greeting = {"Hello!", "Welcome!"};
    System.out.println(greeting[3]); // 这里会引发异常
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("捕获到异常:" + e);
} finally {
    System.out.println("无论如何,这段代码总会执行。");
}

运行结果:

  • 捕获到异常: java.lang.ArrayIndexOutOfBoundsException
  • 执行 finally 块: 打印释放资源或其他操作。

2.2 finally的作用

finally块保证了无论是否发生异常,特定代码一定会执行。常见用法包括关闭文件、释放锁、关闭数据库连接等。


三、throwthrows

3.1 throw关键字

  • 用来抛出一个异常对象,一般用于方法内部。
java 复制代码
if (value < 0) {
    throw new IllegalArgumentException("Value cannot be negative.");
}

3.2 示例:捕获后再次抛出异常

catch捕获异常但无法完全解决时,可以修改异常对象,然后抛出给上一层处理

java 复制代码
public static void main(String[] args) {
    try {
        methodWithException();
    } catch (Exception e) {
        System.out.println("再次捕获到异常:" + e);
    }
}

public static void methodWithException() {
    try {
        int[] array = {1, 2};
        System.out.println(array[3]); // 引发异常
    } catch (ArrayIndexOutOfBoundsException e) {
        System.out.println("捕获到异常:" + e);
        throw e; // 再次抛出
    } finally {
        System.out.println("Finally 块中的代码总会执行。");
    }
}

运行结果:

  1. 捕获到异常:java.lang.ArrayIndexOutOfBoundsException
  2. 再次捕获到异常。

四、异常处理的运行结果对比

4.1 没有异常处理时

如果没有捕获异常,程序直接中断。例如:

java 复制代码
public static void main(String[] args) {
    String[] greeting = {"Hello", "Hi"};
    for (int i = 0; i < 4; i++) {
        System.out.println(greeting[i]); // i=2 时数组越界
    }
}

运行结果:java.lang.ArrayIndexOutOfBoundsException,程序直接退出。


4.2 加入异常捕获后

通过try/catch捕获异常后,程序可以正常运行,不会中断。例如:

java 复制代码
public static void main(String[] args) {
    String[] greeting = {"Hello", "Hi"};
    for (int i = 0; i < 4; i++) {
        try {
            System.out.println(greeting[i]);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("捕获异常:" + e);
        } finally {
            System.out.println("Finally 块中的代码。");
        }
    }
}

运行结果:

  1. 正常打印数组内容。
  2. 捕获并处理越界异常。
  3. 每次循环都执行finally块中的代码。

五、总结

  1. 异常的意义:

    通过处理异常,程序能在意外情况下继续运行,而不会中途崩溃。

  2. try/catch语法:

    捕获并处理异常,catch块里定义如何处理。

  3. finally

    任何情况下都要执行的操作,比如释放资源。

  4. 抛出异常:

    如果catch不能完全解决问题,可以将异常"甩锅"给上层。

通过有效的异常处理,我们可以编写更加健壮、容错性更强的程序。

最后说一句(求关注,求赞,别白嫖我)

最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。
这是大佬写的
7701页的BAT大佬写的刷题笔记,让我offer拿到手软

本文,已收录于,我的技术网站 cxykk.com:程序员编程资料站,有大厂完整面经,工作技术,架构师成长之路,等经验分享

求一键三连:点赞、分享、收藏

点赞对我真的非常重要!在线求赞,加个关注我会非常感激!

相关推荐
geovindu19 分钟前
python: generator model using mysql9.0 or postgreSQL 17.0
开发语言·python·mysql·postgresql
萨达大26 分钟前
23种设计模式-单例(Singleton)设计模式
java·c++·单例模式·设计模式·软考·创建型设计模式·软件设计师
oscar99928 分钟前
Java 语言的起源发展与基本概念(JDK,JRE,JVM)
java·开发语言·jvm
Pandaconda35 分钟前
【新人系列】Python 入门(十四):文件操作
开发语言·笔记·后端·python·面试·操作系统·测试
go_bai36 分钟前
动态内存管理的知识点笔记总结
c语言·开发语言·笔记·c#·学习方法
zaim136 分钟前
计算机的错误计算(一百六十八)
java·c++·python·matlab·rust·c#·大数
Reeeeeeeeeee-38 分钟前
[MRCTF2020]Transform
c语言·开发语言·汇编·c++·算法
阿里-于怀40 分钟前
消息队列详解:从基础到高级应用
java·数据库·中间件
萨达大43 分钟前
23种设计模式-装饰器(Decorator)设计模式
java·c++·设计模式·软考·装饰器模式·软件设计师·结构型设计模式
蒜蓉大猩猩1 小时前
Vue.js - axios网络请求
开发语言·javascript·ecmascript