【问题标题】:defining a list of exception classes - Type mismatch error定义异常类列表 - 类型不匹配错误
【发布时间】:2012-09-02 02:25:58
【问题描述】:

我正在尝试定义一个异常类列表,如下所示:

private static final List<Class<? extends Exception>> SOME_ERRORS = Arrays.asList(NumberFormatException.class, NullPointerException.class);

我从 Eclipse 得到的错误是这样的:

Type mismatch: cannot convert from List<Class<? extends RuntimeException>> to List<Class<? extends Exception>>

你能建议吗?我不明白为什么它不能将异常列表转换为异常列表...

【问题讨论】:

    标签: java list exception generics type-conversion


    【解决方案1】:

    Reimeus's answer +1。但是,如果您希望保留使用父 Exception 类型声明的列表,这是我能想到的最好的方法(使用 Java 7 语法):

    private static final List<Class<? extends Exception>> SOME_ERRORS = new ArrayList<>();
    static{
        SOME_ERRORS.add(NumberFormatException.class);
        SOME_ERRORS.add(NullPointerException.class);
    }
    

    您的问题是由于Arrays.asList 自动为您确定正确的列表类型。为了比较,这也没有错误:

    private static final List<Class<? extends Exception>> SOME_ERRORS = Arrays.asList(NumberFormatException.class, NullPointerException.class, Exception.class);
    

    尤其是处理“常量”(static finals),通常最好建议您确保此类数组/集合不能被修改。在最坏的情况下,这可以避免遇到一些困难的问题。例如:

    private static final List<Class<? extends Exception>> SOME_ERRORS;
    static{
        List<Class< ? extends Exception>> errors = new ArrayList<>();
        errors.add(NumberFormatException.class);
        errors.add(NullPointerException.class);
    
        SOME_ERRORS = Collections.unmodifiableList(errors);
    }
    

    【讨论】:

    • 这让我感到惊讶。一旦我添加了 FileNotFoundException.class 代码编译。我仍然觉得它很奇怪,但我想我现在明白为什么会这样了。谢谢
    • 接受您对这条信息的回答“您的问题是由于 Arrays.asList 自动为您确定正确的列表类型。”
    【解决方案2】:

    你应该使用:

    List<Class<? extends RuntimeException>> SOME_ERRORS = Arrays.asList(NumberFormatException.class, NullPointerException.class);
    

    Arrays.asList 返回的泛型类型将始终使用最具体的类型,即RuntimeException。如果您在列表中添加了已检查异常,则此语句将变为:

    List<Class<? extends Exception>> SOME_ERRORS = Arrays.asList(IOException.class, NumberFormatException.class, NullPointerException.class);
    

    【讨论】:

    • 但是,运行时异常不扩展异常吗?我显然想要一个扩展 Exception 类的任何异常类的列表。如果我在列表中添加一个非运行时异常怎么办?
    • 回答我自己的问题,将非运行时异常添加到列表中可以正常工作,突然编译。
    猜你喜欢
    • 2020-10-02
    • 2014-05-23
    • 2015-10-17
    • 2014-11-10
    • 2013-01-16
    • 2017-11-17
    • 2012-07-24
    • 2023-03-06
    相关资源
    最近更新 更多