面试题答案
一键面试抛出异常规则
- 一致性:实现接口方法时,抛出的异常必须和接口方法声明的异常一致,或者是接口方法声明异常的子类。这是因为接口定义了一种契约,实现类要遵循该契约。如果实现类抛出比接口声明范围更广的异常,调用者在按照接口契约编写代码时,可能无法处理这些额外的异常,导致程序运行时出现未处理异常的错误。
- 可不抛异常:实现类也可以选择不抛出异常,只要实现的功能不产生接口声明的异常情况即可。
实现类注意事项
当接口方法声明抛出IOException
时,实现该接口的类在实现此方法需注意:
- 若实现方法中可能出现
IOException
相关的异常情况,必须声明抛出IOException
或者其某个子类,如FileNotFoundException
(它是IOException
的子类)。 - 如果实现方法中不会出现
IOException
相关异常,可不声明抛出该异常。
示例
import java.io.IOException;
// 定义接口
interface FileProcessor {
void processFile() throws IOException;
}
// 实现类
class TextFileProcessor implements FileProcessor {
@Override
public void processFile() throws IOException {
// 模拟打开文件操作,可能会抛出IOException
throw new IOException("文件读取错误");
}
}
实际应用场景
在处理文件操作的接口中应用广泛。例如,定义一个文件读取接口FileReader
,接口方法声明抛出IOException
。不同类型文件(文本文件、二进制文件等)的读取类实现该接口,在实现方法中,当遇到文件不存在、文件损坏等可能导致IOException
的情况时,抛出该异常,调用者(如文件处理框架)按照接口契约统一处理这些异常,提高代码的可维护性和扩展性。
import java.io.IOException;
// 文件读取接口
interface FileReader {
String readFile(String filePath) throws IOException;
}
// 文本文件读取实现类
class TextFileReader implements FileReader {
@Override
public String readFile(String filePath) throws IOException {
// 实际的文件读取逻辑,可能会因文件不存在等原因抛出IOException
return "模拟读取的文本内容";
}
}
// 调用者
class FileProcessorApp {
public static void main(String[] args) {
FileReader textReader = new TextFileReader();
try {
String content = textReader.readFile("test.txt");
System.out.println("读取内容: " + content);
} catch (IOException e) {
System.err.println("文件读取错误: " + e.getMessage());
}
}
}
在上述例子中,FileReader
接口定义了读取文件的方法并声明抛出IOException
,TextFileReader
实现类实现该方法,若文件读取出现问题可抛出IOException
,调用者FileProcessorApp
按照接口约定捕获并处理异常。