面试题答案
一键面试- 使用try - catch块:
- 在遍历
shapes
列表时,使用try - catch
块捕获DrawingException
异常。
List<Shape> shapes = new ArrayList<>(); shapes.add(new Circle()); shapes.add(new Rectangle()); for (Shape shape : shapes) { try { shape.draw(); } catch (DrawingException e) { // 在这里处理异常,例如记录日志,给出用户友好提示等 System.err.println("绘图时发生异常: " + e.getMessage()); } }
- 这种方式的优点是简单直接,在捕获异常时可以进行特定的处理逻辑,如记录日志、向用户反馈错误信息等。但如果在不同地方调用
draw
方法,代码中会有较多重复的try - catch
块。
- 在遍历
- 使用函数式编程与异常处理工具类:
- 可以定义一个工具类来处理异常,将
try - catch
逻辑封装在工具类方法中。
import java.util.List; import java.util.ArrayList; import java.util.function.Consumer; class ExceptionUtil { public static <T, E extends Exception> Consumer<T> handleException(Class<E> exceptionClass, Consumer<E> exceptionConsumer) { return t -> { try { // 假设这里有一个方法调用,例如通过反射获取实际调用方法 java.lang.reflect.Method method = t.getClass().getMethod("draw"); method.invoke(t); } catch (Exception e) { if (exceptionClass.isInstance(e)) { exceptionConsumer.accept(exceptionClass.cast(e)); } else { throw new RuntimeException(e); } } }; } }
- 然后在遍历
shapes
时使用这个工具类。
List<Shape> shapes = new ArrayList<>(); shapes.add(new Circle()); shapes.add(new Rectangle()); shapes.forEach(ExceptionUtil.handleException(DrawingException.class, e -> { // 处理异常 System.err.println("绘图时发生异常: " + e.getMessage()); }));
- 这种方式将异常处理逻辑封装起来,使得遍历代码更简洁,提高了代码的可维护性和可扩展性。如果有新的异常类型需要处理,可以在
ExceptionUtil
类中添加新的处理逻辑。同时也利用了函数式编程的特性,使代码结构更清晰。
- 可以定义一个工具类来处理异常,将