MST

星途 面试题库

面试题:Java接口异常处理与多态的结合

假设有一个接口`Shape`,其中定义了一个方法`draw`可能抛出`DrawingException`异常。有`Circle`和`Rectangle`类实现了该接口。在一个使用`Shape`接口的多态场景中,如`List<Shape> shapes = new ArrayList<>(); shapes.add(new Circle()); shapes.add(new Rectangle());`,然后遍历`shapes`调用`draw`方法,如何优雅地处理可能抛出的`DrawingException`异常,同时又能保持代码的可扩展性和可读性?
49.9万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 使用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块。
  2. 使用函数式编程与异常处理工具类
    • 可以定义一个工具类来处理异常,将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类中添加新的处理逻辑。同时也利用了函数式编程的特性,使代码结构更清晰。