程序结束函数有没有java注解?摆脱 "missing return statement"

Is there a java annotation for function ending the program? Get rid of "missing return statement"

我有以下代码

public enum Animal {
    DOG,CAT;
    
    private void exitWithError(String message){
        System.out.println(message);
        System.exit(1);
    }
    
    @Override
    public String toString() {
        switch(this){
            case DOG:
                return "dog";
            case CAT:
                return "cat";
            default:
                //                missing return statement error
                exitWithError("unrecognized animal");

/*
                 workaround - don't like it
                 return null;
 */

/*               no error if exception thrown
                 throw new IllegalStateException("unrecognized animal");

 */

        }
    }
}

以上代码导致 missing return statement 错误。我有一些问题:

  1. exitWithError 方法应该总是完成程序执行,对吧?

  2. 如果该方法总是退出,有什么方法可以通知编译器它不会向我抛出 missing return statement

return null 解决方法似乎是错误的代码,就好像代码已更改并且执行此 return 语句可能会导致问题。

A toString() 方法不应该退出程序。更一般地说,几乎没有 方法应该尝试退出程序。

想想 System.out.println(EnumSet.allOf(Animal.class)); 导致程序退出是多么令人惊讶。 (现在不会,但如果您添加了另一个 Animal 并忘记更新 toString()),它可能会出现。

如果你想指出这里有什么问题,抛出一个异常(或错误),允许调用者处理它,如果他们能够:

@Override
public String toString() {
    switch(this){
        case DOG:
            return "dog";
        case CAT:
            return "cat";
    }
    throw new AssertionError();
}

throw 实际上是不可访问的,但是编译器不知道这一点: throw 是说服编译器该方法无法正常完成所必需的(即没有返回值或抛出).

或者,在 Java 12+ 中,编译器将检查枚举上的 switch 表达式的完整性:

return switch (this) {
  DOG -> "dog";
  CAT -> "cat";
})

但是,另一种方法(在 Java 12 之前可用)是使 toString() 成为构造函数的参数,因此您永远不必担心 Animal 没有已知的 toString():

enum Animal {
  DOG("dog"), CAT("cat");

  private String string;

  Animal(String string) { this.string = string; }

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