面试题答案
一键面试区别
- 检查异常(继承自Exception):
- 这种异常属于受检异常(Checked Exception),即当一个方法可能抛出继承自Exception(不包括继承自RuntimeException)的异常时,该方法必须使用
throws
关键字声明抛出该异常,或者在方法内部捕获处理该异常。 - 它表示程序运行过程中可能出现的、但合理的异常情况,调用者应该知道如何处理这类异常。
- 这种异常属于受检异常(Checked Exception),即当一个方法可能抛出继承自Exception(不包括继承自RuntimeException)的异常时,该方法必须使用
- 运行时异常(继承自RuntimeException):
- 这类异常属于非受检异常(Unchecked Exception),方法不需要声明抛出这类异常,调用者也可以不捕获处理这类异常。
- 它通常表示程序中的逻辑错误,如空指针引用、数组越界等,这类异常是程序员在编码过程中应该避免的。
场景举例
- 继承自Exception的场景: 假设我们有一个读取文件的方法。由于文件可能不存在、没有读取权限等原因会抛出异常,这种异常是程序运行时合理可能出现的情况,调用者应该有相应的处理逻辑。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class FileReadingExample {
public static String readFile(String filePath) throws FileReadException {
StringBuilder content = new StringBuilder();
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = br.readLine()) != null) {
content.append(line).append("\n");
}
} catch (IOException e) {
throw new FileReadException("Error reading file: " + filePath, e);
}
return content.toString();
}
}
class FileReadException extends Exception {
public FileReadException(String message, Throwable cause) {
super(message, cause);
}
}
在调用readFile
方法时,调用者必须处理FileReadException
异常,例如:
public class Main {
public static void main(String[] args) {
try {
String content = FileReadingExample.readFile("nonexistentfile.txt");
System.out.println(content);
} catch (FileReadException e) {
System.out.println("Caught FileReadException: " + e.getMessage());
}
}
}
- 继承自RuntimeException的场景: 假设我们有一个计算两个整数相除的方法,当除数为0时,这是一个逻辑错误,应抛出运行时异常。
public class DivisionExample {
public static int divide(int dividend, int divisor) {
if (divisor == 0) {
throw new DivisionByZeroException("Cannot divide by zero");
}
return dividend / divisor;
}
}
class DivisionByZeroException extends RuntimeException {
public DivisionByZeroException(String message) {
super(message);
}
}
调用divide
方法时,调用者可以选择不捕获DivisionByZeroException
异常,因为这是程序逻辑错误导致的异常,在正常情况下不应发生。
public class Main {
public static void main(String[] args) {
int result = DivisionExample.divide(10, 0);
System.out.println(result);
}
}
上述代码在运行时会抛出DivisionByZeroException
异常,但调用者没有强制捕获处理它。如果在实际应用中,程序员应该检查除数是否为0,避免出现这种运行时异常。