八、异常
在Java中,异常处理是一个重要的主题,因为它涉及到如何处理程序中的错误和异常情况。在日常工作中,正确地处理异常可以提供程序的健壮性和可维护性。以下是结合日常工作经验对Java异常处理的一些详细叙述:
1.基础概念
(1).分类
- 受检异常(Checked Exception) :必须在编译时处理的异常,例如
IOException
。这些异常通常是由于外部因素引起的,如文件未找到、网络故障等。 - 非受检异常(Unchecked Exception):运行时异常和错误(
RuntimeException
和Error
),例如NullPointerException
、ArrayIndexOutOfBoundsException
。这些异常通常是编程错误引起的。
(2).层次结构
所有异常类都是
Throwable
类的子类。
Throwable
可以用来表示任何可以作为异常抛出的类,分为两种: Error 和 Exception 。其中 Error 用来表示 JVM
无法处理的错误,Exception 分为两种:
-
受检异常 :需要用 try...catch... 语句捕获并进行处理,并且可以从异常中恢复;
-
非受检异常 :是程序运行时错误,例如除 0 会引发 Arithmetic Exception,此时程序崩溃并且无法恢复。
-
Java Exception Interview Questions and Answers(opens new window)
2.处理语法
(1).try-catch
java
try {
//可能抛出异常的代码
} catch (SomeException e) {
// 处理异常的代码
}
(2).try-with-resources
java
//try-with-resources 语句
try (Resource res = new Resource()) {
// 使用资源的代码
} catch (SomeException e) {
// 处理异常的代码
}
(3).finally
无论是否抛出异常,
finall
块中的代码都会执行,用于清理资源。
java
//try-finally 语句
try {
// 可能抛出异常的代码
} finally {
// 无论是否发生异常,都会执行的代码
}
3.常见处理策略
(1).捕获并处理
在方法内捕获异常并处理,例如记录日志或恢复操作
java
try {
// 代码块
} catch (IOException e) {
log.error("IO Exception occurred", e);
// 恢复操作
}
(2).向上抛出
方法内不处理异常,而是将异常向上抛给调用者
java
public void readFile() throws IOException {
// 代码块
}
(3).全局异常处理
在应用程序中设置全局异常处理机制,例如使用Spring框架中的@controllerAdvice
进行全局控制器异常处理。
java
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException(Exception e) {
return new ResponseEntity<>("An error occurred: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
4.工作应用
(1).记录日志
记录详细的异常信息是非常重要的,可以帮助调试和问题定位
java
catch (SQLException e) {
log.error("Database access error", e);
}
(2).自定义异常
创建自定义异常类,以提供更明确的错误信息。
java
public class CustomException extends Exception {
public CustomException(String message){
super(message);
}
}
(3).使用断言和验证
在方法开始时进行参数验证,使用
IllegalArgumentException
或自定义异常。
java
public void setAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("Age cannot be negative");
}
this.age = age;
}
(4).资源管理
确保在异常情况下也能正确释放资源,例如使用
try-with-resources
。
java
//try-with-resources 语句
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
// 使用资源的代码
} catch (IOException e) {
log.error("Error reading file", e);
// 处理异常的代码
}
5.总结
异常处理是Java编程中必不可少的一部分。通过正确的处理异常,可以提高程序的健壮性和可维护性。
在日常工作中,应该养成良好的异常处理习惯,如记录日志、进行参数验证、合理的选择处理策略等。这些实践将帮助你编写出更加稳定和可靠的代码。