面试题答案
一键面试1. 自定义异常类设计
- 创建基础异常类:
- 定义一个继承自
IOException
的基础异常类,作为所有自定义输入输出流异常的基类。这样可以确保与Java标准的I/O异常体系兼容。
public class CustomIOStreamException extends IOException { public CustomIOStreamException(String message) { super(message); } public CustomIOStreamException(String message, Throwable cause) { super(message, cause); } }
- 定义一个继承自
- 创建具体异常子类:
- 根据项目中可能出现的不同I/O异常场景,创建具体的子类。例如,读取文件失败、写入文件失败等。
public class CustomFileReadException extends CustomIOStreamException { public CustomFileReadException(String message) { super(message); } public CustomFileReadException(String message, Throwable cause) { super(message, cause); } } public class CustomFileWriteException extends CustomIOStreamException { public CustomFileWriteException(String message) { super(message); } public CustomFileWriteException(String message, Throwable cause) { super(message, cause); } }
2. 异常处理流程
- 捕获异常:
- 在进行输入输出操作的方法中,捕获可能出现的标准I/O异常,并将其转换为自定义异常。
public class CustomIOOperations { public void readFile(String filePath) { try { // 标准文件读取操作 FileInputStream fis = new FileInputStream(filePath); // 读取逻辑... fis.close(); } catch (FileNotFoundException e) { throw new CustomFileReadException("文件未找到: " + filePath, e); } catch (IOException e) { throw new CustomFileReadException("读取文件时出错: " + filePath, e); } } public void writeFile(String filePath, String content) { try { // 标准文件写入操作 FileOutputStream fos = new FileOutputStream(filePath); fos.write(content.getBytes()); fos.close(); } catch (FileNotFoundException e) { throw new CustomFileWriteException("文件未找到: " + filePath, e); } catch (IOException e) { throw new CustomFileWriteException("写入文件时出错: " + filePath, e); } } }
- 异常传播:
- 方法捕获并转换异常后,可以选择将异常继续向上传播,让调用者处理。
public class Main { public static void main(String[] args) { CustomIOOperations ioOps = new CustomIOOperations(); try { ioOps.readFile("nonexistent.txt"); } catch (CustomFileReadException e) { // 处理读取文件异常 System.err.println("处理读取文件异常: " + e.getMessage()); e.printStackTrace(); } } }
3. 与Spring框架集成
- 使用Spring AOP:
- 配置Spring AOP,在Service层方法执行前后进行异常处理。
- 首先,在
pom.xml
中添加Spring AOP依赖(如果使用Maven):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter -aop</artifactId> </dependency>
- 创建一个切面类来处理异常:
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; @Aspect @Component public class CustomIOAspect { @Around("execution(* com.example.demo.service.*.*(..))") public Object handleIOExceptions(ProceedingJoinPoint joinPoint) throws Throwable { try { return joinPoint.proceed(); } catch (CustomIOStreamException e) { // 记录异常日志等操作 System.err.println("捕获到自定义I/O异常: " + e.getMessage()); throw e; } } }
- 在Spring配置类中启用AspectJ自动代理:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.aop.aspectj.AspectJExpressionPointcut; import org.springframework.aop.support.DefaultPointcutAdvisor; import org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator; @Configuration public class AopConfig { @Bean public AnnotationAwareAspectJAutoProxyCreator annotationAwareAspectJAutoProxyCreator() { return new AnnotationAwareAspectJAutoProxyCreator(); } }
4. 关键代码示例总结
- 自定义异常类:
public class CustomIOStreamException extends IOException { // 构造函数... } public class CustomFileReadException extends CustomIOStreamException { // 构造函数... } public class CustomFileWriteException extends CustomIOStreamException { // 构造函数... }
- 异常处理方法:
public class CustomIOOperations { public void readFile(String filePath) { // 捕获标准I/O异常并转换为自定义异常 } public void writeFile(String filePath, String content) { // 捕获标准I/O异常并转换为自定义异常 } }
- Spring AOP集成:
@Aspect @Component public class CustomIOAspect { @Around("execution(* com.example.demo.service.*.*(..))") public Object handleIOExceptions(ProceedingJoinPoint joinPoint) throws Throwable { // 捕获自定义I/O异常并处理 } }