一、Java异常(Exception)基本概念
什么是异常?
简单来说,异常就是程序运行时发生了意外的"错误"或者"不正常现象",导致程序中断。异常处理的目标是让程序在出现问题时能稳住,不会直接崩溃。
1.1 异常的分类
Java中的异常分为两大类:错误 (Error) 和 异常 (Exception)。
-
错误 (Error):
通常由硬件或操作系统问题引起,Java程序无法解决。例如:内存不足(OutOfMemoryError)。
-
异常 (Exception):
包括两种:
- 运行时异常 (RuntimeException):
这类问题可以不处理(程序不会强制要求),但最好避免。例如:ArithmeticException
:除数为零。ArrayIndexOutOfBoundsException
:数组越界。NullPointerException
:对象为空时调用方法。
- 一般异常 (Checked Exception):
必须处理,否则程序无法编译。例如:IOException
:输入输出错误。ClassNotFoundException
:类或接口找不到。
- 运行时异常 (RuntimeException):
1.2 异常的处理方法
处理异常有两种主要方式:
- 直接处理:
用try...catch
块捕获并处理异常,或在finally
中清理资源。 - 抛出异常:
将异常交给调用方法的"上一层"去处理。使用throw
或throws
关键字完成。
二、异常捕获和处理
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
块保证了无论是否发生异常,特定代码一定会执行。常见用法包括关闭文件、释放锁、关闭数据库连接等。
三、throw
与throws
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 块中的代码总会执行。");
}
}
运行结果:
- 捕获到异常:
java.lang.ArrayIndexOutOfBoundsException
- 再次捕获到异常。
四、异常处理的运行结果对比
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 块中的代码。");
}
}
}
运行结果:
- 正常打印数组内容。
- 捕获并处理越界异常。
- 每次循环都执行
finally
块中的代码。
五、总结
-
异常的意义:
通过处理异常,程序能在意外情况下继续运行,而不会中途崩溃。
-
try/catch
语法:捕获并处理异常,
catch
块里定义如何处理。 -
finally
:任何情况下都要执行的操作,比如释放资源。
-
抛出异常:
如果
catch
不能完全解决问题,可以将异常"甩锅"给上层。
通过有效的异常处理,我们可以编写更加健壮、容错性更强的程序。
最后说一句(求关注,求赞,别白嫖我)
最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。
这是大佬写的 7701页的BAT大佬写的刷题笔记,让我offer拿到手软
本文,已收录于,我的技术网站 cxykk.com:程序员编程资料站,有大厂完整面经,工作技术,架构师成长之路,等经验分享
求一键三连:点赞、分享、收藏
点赞对我真的非常重要!在线求赞,加个关注我会非常感激!