交换机有什么好的“无法访问”错误?

时间:2016-03-15 15:44:54

标签: java exception jls

Eclipse迫使我对任何default使用switch个案,包括那些列出所有声明的enum值的案例,据称是因为语言规范[1]。这是不幸的,因为项目是并行开发的Android Studio不会,并且自然会警告我switch如果enum被更改,那么enum将变得不完整。虽然我更喜欢后一种行为,因为前者使Error更改实际上更多容易出错(参见下面的示例),我无法选择,所以我需要找到如何这样做适合两者。我想如果代码中有一个地方应该在任何情况下仍然无法访问但仍然无法删除该行,那么抛出一个new Error("enum name")似乎是很自然的事情。但是哪一个,是否有一个普遍接受的子类用于这种情况(可能延伸到其他“强制”无法到达的地方)?或者只是为了它而简单地抛出一个快速而肮脏的public static enum Color { RED, GREEN, BLUE; @Override public String toString() { switch(this) { case RED: return "Red"; case GREEN: return "Green"; case BLUE: return "Blue"; default: /* never reached */ throw new ThisCanNeverHappenError(); } } } ,而不是仅仅为了从未使用过来自己编写它?

在示例中:

WHITE

enum添加到switch会使这个CREATE TRIGGER COPY_UPDATED_USERNAME AFTER UPDATE ON ALLUSERS REFERENCING NEW AS NEWUSERNAME_ROW FOR EACH ROW MODE DB2SQL UPDATE ALLUSERS_MAINTABSPERMISSION SET USERNAME = NEWUSERNAME_ROW.USERNAME 以及可能更多的代码在整个代码中出现令人讨厌的错误,因为流控制会发现它们很好。

5 个答案:

答案 0 :(得分:2)

Eclipse Bugzilla/Bug 374605对此进行了长时间的讨论。

最终结果是这是一个可配置的警告,可以被禁用。

enter image description here

将下拉列表从警告更改为忽略

答案 1 :(得分:1)

投掷Error并不是一个非常明智的举动 - 大多数异常处理代码都会通过它们,它们最终会出现在奇怪的地方,可能会使您的进程无法使用。

我建议IllegalStateException

答案 2 :(得分:1)

如果将“toString”值添加为枚举实例的参数,则不需要此开关(以及默认情况的相应处理):

public static enum Color {
    RED("Red"),
    GREEN("Green"),
    BLUE("Blue");

    private final String name;

    private Color(String name) {
      this.name = name;
    }

    @Override
    public String toString() {
      return name;
    }
}

答案 3 :(得分:1)

你不应该抛出Error。更好的例外应该是IllegalStateException

switch(this) {
    case RED:
        return "Red";
    case GREEN:
        return "Green";
    case BLUE:
        return "Blue";
    default:
        throw new IllegalStateException("Unexpected enum value: " + this.name());
}

另一方面,你不应该在那里使用switch声明。在枚举中添加一个字段。另请注意,枚举始终为static,因此您可以删除该关键字。

public enum Color {
    RED  ("Red"),
    GREEN("Green"),
    BLUE ("Blue");

    private final String displayText;

    private Color(String displayText) {
        this.displayText = displayText;
    }
    public String getDisplayText() {
        return this.displayText;
    }
    @Override
    public String toString() {
        return this.displayText;
    }
}

答案 4 :(得分:1)

你正在做一个断言:/* never reached */ - 如果那个断言是错误的,你应该抛出一个AssertionError

抛出IllegalStateException的替代建议并不合适 - 根据javadoc:

  

表示在非法或不适当的时间调用了某个方法

这不是真的。