gpt4 book ai didi

java - Java中有没有 "noreturn"关键字

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

有时我想写一个 error() 函数,它最终肯定会调用 System.exit() ,这意味着这个函数永远不会返回。但是,如果我在其他函数中调用 error(),我想这样写:

int fun() {
...
error();
}

但是编译器坚持在 error() 调用后返回一个 int 值,因为它不知道 error() 永远不会返回。我当然可以返回一个任意的int,但是如果返回类型是一个复杂的类,我需要在代码中构造它,这是浪费时间。有什么方法可以告诉编译器函数永远不会返回吗?

最佳答案

在 Java 方法签名中无法告诉编译器该方法不能返回。否则,编译器别无选择,只能假设它可能会返回。 (事实上​​ ,关于可达性/明确分配的 JLS 规则将明确说明这一点......如果你愿意仔细阅读它们。)

我在两种方法之间 Swing 不定:

int fun() {
...
error();
return 0; // NOT REACHED
}

int fun() {
...
error();
throw new AssertionError("not reached");
}

两者都不完全令人满意。

在第一个版本中,注释很重要,因为第一次阅读您的代码的人可能没有意识到 error 永远不会返回。

第二个版本更健壮,因为如果有人更改 error 方法的行为使其实际返回,它会给您一个“快速失败”。 (第一个版本将导致 fun 方法返回一个虚假值……可能会导致其他意想不到的后果。)


与此相关,通过调用 System.exit() 来拔掉 JVM 插头的方法可能会出现问题。一个更好的主意是抛出一个未经检查的“世界末日”异常并在主线程的最外层捕获它。对于在其他线程上抛出的异常,一个想法是安装一个默认的未捕获异常处理程序,该处理程序使用 Thread.interrupt() 通知主线程已抛出“世界末日”异常。

但重点是在代码深处进行的 System.exit() 调用是有问题的;例如如果您重新调整代码以在更大的框架内运行;例如在网络容器中。

关于java - Java中有没有 "noreturn"关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5588474/

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