Java后端学习系列(3):Java异常处理与常用类库
前言
经过前面两期对Java后端基础以及面向对象相关重要知识的学习,我们已经打下了一定的基础。本期我们将聚焦于Java异常处理机制以及常用类库的探索,这两部分内容在日常的Java开发中是极为常用且关键的,掌握好它们能让我们更高效、稳健地进行代码编写与项目开发。本系列一共15期,会持续为大家梳理Java后端各方面的核心知识。
一、Java异常体系结构剖析
1.1 异常的分类
在Java中,异常分为两大类,即Error(错误)和Exception(异常)。
- Error:一般是指Java虚拟机无法解决的严重问题,比如
OutOfMemoryError(内存溢出错误)、StackOverflowError(栈溢出错误)等,这类问题通常是由于系统资源耗尽或者程序本身存在严重的逻辑错误等导致的,程序一般无法恢复执行,只能终止。 - Exception:又可以细分为
Checked Exception(受检异常)和Unchecked Exception(非受检异常,也叫运行时异常)。- Checked Exception:像
IOException(输入输出异常)、SQLException(数据库操作异常)等,这类异常在编译时就会被强制要求处理,要么通过try-catch语句捕获,要么在方法声明处使用throws关键字抛出。 - Unchecked Exception:例如
NullPointerException(空指针异常)、ArrayIndexOutOfBoundsException(数组越界异常)等,这类异常不需要在编译时显式处理,但是在运行时如果出现会导致程序中断,所以我们在编写代码时也要尽量避免出现这类异常。
- Checked Exception:像
1.2 异常类的继承关系
所有的异常类都继承自Throwable类,Error和Exception作为它的直接子类,然后各自又有众多的具体异常子类,形成了一个层次分明的异常体系结构,方便我们在不同场景下准确地抛出和处理相应的异常情况。
二、异常处理机制与实践
2.1 try-catch语句块
try-catch语句是捕获和处理异常的常用方式,基本语法如下:
try {
// 可能会抛出异常的代码块
FileReader fileReader = new FileReader("test.txt");
} catch (FileNotFoundException e) {
// 捕获到对应异常后的处理逻辑,比如打印异常信息等
System.out.println("文件未找到异常:" + e.getMessage());
}
在try块中放置可能会抛出异常的代码,当异常发生时,程序会立即跳转到对应的catch块中执行相应的处理逻辑,这样可以避免程序因为异常而直接崩溃,能够继续往下执行其他部分的代码。
2.2 finally块
finally块通常用于放置无论是否发生异常都需要执行的代码,比如关闭资源(文件流、数据库连接等)。示例如下:
FileReader fileReader = null;
try {
fileReader = new FileReader("test.txt");
} catch (FileNotFoundException e) {
System.out.println("文件未找到异常:" + e.getMessage());
} finally {
if (fileReader!= null) {
try {
fileReader.close();
} catch (IOException e) {
System.out.println("关闭文件流时出现异常:" + e.getMessage());
}
}
}
不管在try块中是否出现异常,finally块中的代码都会被执行,确保资源能够被正确释放,避免资源泄露等问题。
2.3 throws关键字
如果一个方法内部可能会抛出异常,但是不想在当前方法内处理,就可以使用throws关键字将异常抛给调用该方法的上层代码去处理,例如:
public void readFile() throws FileNotFoundException {
FileReader fileReader = new FileReader("test.txt");
}
这样,调用readFile方法的地方就需要对FileNotFoundException进行处理,要么通过try-catch捕获,要么继续使用throws往上抛。
三、常用的Java类库介绍
3.1 java.util包下的常用工具类
- ArrayList:动态数组,相较于普通数组,它可以方便地进行元素的添加、删除和修改等操作。示例如下:
ArrayList<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.remove(0);
- HashMap:用于存储键值对数据,能根据键快速查找对应的值,在很多场景中用于数据的映射和缓存等。示例:
HashMap<Integer, String> map = new HashMap<>();
map.put(1, "One");
map.put(2, "Two");
String value = map.get(1);
- Collections:提供了一系列对集合进行操作的静态方法,比如对集合进行排序、反转等操作。例如:
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(5);
numbers.add(3);
numbers.add(8);
Collections.sort(numbers);
3.2 日期时间处理相关类
- Date类:是Java早期用于处理日期和时间的类,不过现在已经不推荐直接使用,它存在一些设计上的不足,比如可变性等问题。例如:
Date date = new Date();
System.out.println(date);
- Calendar类:是一个抽象类,用于对日期和时间进行更灵活的操作,比如获取年、月、日等信息,以及进行日期的加减运算等。示例:
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
calendar.add(Calendar.DAY_OF_MONTH, 1);
- LocalDateTime类(Java 8引入):它提供了更加方便、易用且线程安全的日期时间处理方式,能精确到纳秒级别,支持很多便捷的操作方法。例如:
LocalDateTime now = LocalDateTime.now();
LocalDateTime future = now.plusHours(2);
四、下一步学习建议
- 异常处理实践:在自己编写的代码中,尤其是涉及到文件操作、网络通信等容易出现异常的地方,刻意地去运用
try-catch、finally以及throws等异常处理机制,并且思考不同场景下如何更合理地处理异常,避免过度捕获或者遗漏异常情况。 - 类库深入学习:针对介绍的常用类库,深入阅读官方文档,了解更多的方法和用法细节,然后自己动手编写一些示例代码,尝试用不同的类和方法去解决实际的小问题,比如利用集合类实现一个简单的任务管理系统等。
- 代码优化:回顾之前自己写的代码,看看是否有可以通过使用合适的类库或者优化异常处理来提升代码质量和健壮性的地方,进行相应的代码重构。
下期预告
《Java后端学习系列(4):Java多线程与并发编程基础》
- 线程的基本概念与创建方式
- 线程的生命周期与状态转换
- 线程同步机制(如
synchronized关键字等) - 并发容器的基本使用
希望大家通过不断学习和实践,逐步掌握Java后端的这些核心知识,在开发之路上越走越顺。如果在学习过程中有任何疑问或者心得,欢迎在评论区留言分享,我们下期再见。
2299

被折叠的 条评论
为什么被折叠?



