一、异常处理:程序的“安全气囊”
程序运行过程中难免会遇到意外,Java 提供了一套完善的异常处理机制来应对这些突发状况。
-
异常的简介与分类
异常(Exception)本质上是程序运行时发生的非正常事件。Java 将异常主要分为两大类:
编译时异常(Checked Exception):如 IOException ,编译器强制要求处理,否则无法通过编译。
运行时异常(Runtime Exception):如 NullPointerException ,通常由逻辑错误引起,编译器不强制检查。 -
捕获异常:try-catch-finally
这是最基础的处理方式。我们将可能出错的代码放在 try 块中,一旦出错,程序会跳转到对应的 catch 块进行处理。无论是否发生异常, finally 块中的代码(通常用于释放资源)都会执行。
try {
// 尝试执行的代码
int result = 10 / 0;
} catch (ArithmeticException e) {
// 捕获并处理除零异常
System.out.println("除数不能为0");
} finally {
// 无论如何都会执行
System.out.println("执行结束");
} -
抛出异常:throws 和 throw
如果当前方法不知道如何处理异常,可以选择将其“甩锅”给调用者。
throw:用在方法体内,手动抛出一个具体的异常对象(例如 throw new RuntimeException("参数错误") )。
throws:用在方法签名上,声明该方法可能会抛出的异常类型,提醒调用者注意。
- 自定义异常
当 JDK 提供的异常无法满足业务需求时(比如“余额不足异常”),我们可以继承 Exception 或 RuntimeException 来定义自己的异常类,使错误提示更具业务含义。
二、常用 API 工具箱
Java 提供了丰富的类库
-
Math 数学类
Math 类包含了一系列用于基本数字运算的方法,如绝对值 abs() 、最大值 max() 、随机数 random() 等。它的方法是静态的,直接通过类名调用即可,非常便捷。 -
基本数据类型包装类
Java 是面向对象的语言,但基本数据类型(int, double 等)不是对象。为了方便操作,Java 为每个基本类型提供了对应的包装类(如 Integer , Double )。
自动装箱/拆箱:现代 Java 允许我们在基本类型和包装类之间直接赋值,编译器会自动完成转换。
实用功能:包装类还提供了字符串转换( parseInt )、进制转换等实用方法。
三、时间与日期:从 Date 到 Calendar
时间处理一直是编程中的痛点,Java 在这方面经历了多次迭代。
-
Date 类
这是最早期的时间类,虽然很多方法已过时(Deprecated),但获取当前时间戳依然简单: new Date() 。需要注意的是,它的年份计算通常是从 1900 年开始的,月份是从 0 开始的,使用时容易踩坑。 -
Calendar 类
为了解决 Date 的缺陷, Calendar 应运而生。它是一个抽象类,提供了更强大的日历字段操作能力。
获取实例: Calendar.getInstance()
修改时间:可以使用 add() 或 set() 方法灵活地对年、月、日进行加减操作,非常适合处理“下个月的第一天”这种复杂逻辑。
四、时间的格式化与解析
计算机存储的时间通常是毫秒数(Long 类型),而人类习惯看 "yyyy-MM-dd" 格式的字符串。这就需要一个翻译官—— SimpleDateFormat 。
格式化(Format):将Date对象转换为字符串。
解析(Parse):将符合特定格式的字符串转换回Date对象。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = sdf.format(new Date()); // 格式化
Date date = sdf.parse("2023-10-01 12:00:00"); // 解析
五、实战演练:计算时间差
计算两个时间点之间相差的天数。
思路:
将两个时间都转换为毫秒值(使用 getTime() )。
计算毫秒差值的绝对值。
将毫秒差值除以一天的毫秒数(1000 \times 60 \times 60 \times 24)。
这个逻辑不仅适用于天数,稍作修改也能计算小时或分钟差,是日常开发中非常高频的需求。

