gpt4 book ai didi

java - 为什么 Java 编译器拒绝将 System.exit() 识别为过程终止?

转载 作者:搜寻专家 更新时间:2023-11-01 01:16:57 25 4
gpt4 key购买 nike

Java 的编译器,至少是我使用的来自 Oracle 的编译器,拒绝将 System.exit() 识别为过程终止。例如下面的代码给出编译错误:

public static int readInteger( ArrayList<String> listLines, int iLineNumber0 ){
try {
int value = Integer.parseInt( listLines.get( 0 ) );
return value;
} catch( Throwable t ) {
System.err.println( "error reading line: " + iLineNumber0 + ": " + t );
System.exit( -1 );
}
}

错误是:“缺少返回语句。”因此,为了完成这项工作,我必须添加一个像这样的返回语句(编译成功):

public static int readInteger( ArrayList<String> listLines, int iLineNumber0 ){
try {
int value = Integer.parseInt( listLines.get( 0 ) );
return value;
} catch( Throwable t ) {
System.err.println( "error reading line: " + iLineNumber0 + ": " + t );
System.exit( -1 );
}
return 0; // unreachable code
}

具有讽刺意味的是,所需的最终返回语句是无法访问的代码,尽管编译器也没有意识到这一点。

最佳答案

Java's compiler, at least the one from Oracle that I use, refuses to recognize System.exit() as a procedure termination.

是的,会的。就编译器而言,它只是一个 void 方法。没有办法在方法签名中指示“此方法永远不会正常返回”,语言中也没有这样的概念。例如:

public void alwaysThrow()
{
throw new RuntimeException();
}

...

alwaysThrow();
System.out.println("This line is never reached");

就编译器而言,上面代码片段的最后一行仍然可以访问,即使我们知道它永远不会执行。同样,您的额外返回语句技术上可以访问,但实际上无法访问。

基本上这可以被视为语言中的一个缺陷,尽管据我所知它是影响大多数语言的缺陷。虽然能够表示这样的方法会很好,但它很少在现实生活中是一个真正的问题。

如果你发现自己被它困扰,你可以写一个辅助方法:

public RuntimeException systemExit(int exitValue)
{
System.exit(exitValue);
return new RuntimeException("Shouldn't get here");
}

然后称它为:

throw systemExit();

这将确保就编译器而言,语句的末尾是不可到达的,因此您可以:

catch (Throwable t) {
System.err.println("error reading line: " + iLineNumber0 + ": " + t);
throw systemExit(-1);
}

...您的编译器错误将消失。

请注意,在其他类似情况下,可达性并不是我们可能想要的一切。例如:

int foo() {
int x = someValue();
if (x > 10) {
return 1;
}
if (x <= 10) {
return 20;
}
// Is this reachable or not?
}

我们知道 x 的任何值都将大于 10 或小于或等于 10,所以最后一行是 实际上 无法访问,但语言规则并未表达这一点...因此即使是聪明的编译器也无法在不违反语言规范的情况下将上述代码视为有效。

关于java - 为什么 Java 编译器拒绝将 System.exit() 识别为过程终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23446477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com