程序结束函数有没有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
错误。我有一些问题:
exitWithError
方法应该总是完成程序执行,对吧?
如果该方法总是退出,有什么方法可以通知编译器它不会向我抛出 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; }
}
我有以下代码
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
错误。我有一些问题:
exitWithError
方法应该总是完成程序执行,对吧?如果该方法总是退出,有什么方法可以通知编译器它不会向我抛出
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; }
}