【问题标题】:Java extend abstract class with external classJava用外部类扩展抽象类
【发布时间】:2021-01-02 17:29:08
【问题描述】:

我想要一个抽象类InitException 来表示一组类,即StartParameterExceptionFileNotFoundException 等。我自己定义StartParameterException,但FileNotFoundException 是我导入的标准异常.所以我不能像在我自己​​的类中那样将extends InitException 添加到它的定义中:

public class StartParameterException extends InitException {
    ...
}

重点是改变这个:

try {
    ...
} catch (StartParameterException | FileNotFoundException | InvalidPathException | NullBoardException e) {
    System.out.println(e);
    System.exit(INIT_ERROR);
}

到这里

try {
    ...
} catch (InitException e) {
    System.out.println(e);
    System.exit(InitException.ERROR_CODE);
}

这可能吗?我应该以某种方式使用接口吗?

【问题讨论】:

  • 如果你真的打算这样做,那么将InitException 设为一个接口并创建一个实现InitException 并扩展FileNotFoundException 的异常。但是,您必须捕获 FileNotFoundException 并重新抛出您自己的异常。我认为您的原始代码没有任何问题。在应用程序的宏大方案中,将多个 init 异常合并为一个异常似乎并不是特别有益。
  • @Paul 这只是为了代码重用,因为我想使用这个确切的部分两次。但似乎这些解决方案只会引入更多的复杂性,并没有真正的合理性。如果有这样的语言功能会很不错。

标签: java exception interface abstract-class


【解决方案1】:

您可以尝试创建一组异常类。然后检查捕获的异常是否在集合内

Set<Class<?>> setClassesInitExc = new HashSet<>();
setClassesInitExc.add(FileNotFoundException.class);
setClassesInitExc.add(InvalidPathException.class);
setClassesInitExc.add(StartParameterException.class);
setClassesInitExc.add(NullBoardException.class);

try {
    ...     
} catch(Exception e) {
    if (setClassesInitExc.contains(e.getClass())) {
        System.out.println(e);
        System.exit(InitException.ERROR_CODE);     
    }
}

【讨论】:

  • 改用java.util.Set
  • @Johannes Kuhn 是的,这更准确
【解决方案2】:

另一种方法是使用支持的异常类型创建enum,并添加一些处理每个异常所需的上下文,如下所示:

public enum ExceptionEnum {
    START_PARAMETER_EXCEPTION(StartParameterException.class, "Start parameter exception occurred", 1),
    FILE_NOT_FOUND_EXCEPTION(FileNotFoundException.class, "Required file is not found", 2),
    INVALID_PATH_EXCEPTION(InvalidPathException.class, "Given path is not valid", 3),
    NULL_BOARD_EXCEPTION(NullBoardException.class, "Null board exception occurred", 4);

    private Class exceptionClass;
    private String errorMessage;
    private int exitCode;

    public Class getExceptionClass() {
        return exceptionClass;
    }

    public String getErrorMessage() {
        return errorMessage;
    }

    public int getExitCode() {
        return exitCode;
    }

    ExceptionEnum(Class exceptionClass, String errorMessage, int exitCode) {
        this.exceptionClass = exceptionClass;
        this.errorMessage = errorMessage;
        this.exitCode = exitCode;
    }

    public static ExceptionEnum fromExceptionClass(Class clazz) {
        for (ExceptionEnum exceptionEnum : ExceptionEnum.values()) {
            if (exceptionEnum.getExceptionClass().isAssignableFrom(clazz)) {
                return exceptionEnum;
            }
        }
        return null;
    }
}

可以为每个异常添加更多上下文,这样可以更好地控制在运行时如何处理单个异常:

try {
  //....
    } catch (Exception e) {
   ExceptionEnum exceptionEnum = ExceptionEnum.fromExceptionClass(e.getClass());
        if(exceptionEnum != null) {
            System.out.println(exceptionEnum.getErrorMessage());
            System.exit(exceptionEnum.getExitCode());   
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 2011-06-15
    相关资源
    最近更新 更多