gpt4 book ai didi

java - 断言(假)与 RuntimeException?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:11:46 25 4
gpt4 key购买 nike

我正在阅读 XWalkUIClientInternal 的来源我遇到了以下代码:

    switch(type) {
case JAVASCRIPT_ALERT:
return onJsAlert(view, url, message, result);
case JAVASCRIPT_CONFIRM:
return onJsConfirm(view, url, message, result);
case JAVASCRIPT_PROMPT:
return onJsPrompt(view, url, message, defaultValue, result);
case JAVASCRIPT_BEFOREUNLOAD:
// Reuse onJsConfirm to show the dialog.
return onJsConfirm(view, url, message, result);
default:
break;
}
assert(false);
return false;

我以前从未真正见过这种技术,也从未真正想过它,但我猜这基本上意味着“这是无法访问的代码,永远不应该发生”,无论如何都会使应用程序崩溃。虽然从技术上讲,您可以使用 Throwable 来做到这一点,但前提是它没有被捕获。

所以我的问题是,哪个更好,为什么是 assert(false) 或抛出 RuntimeException,或者可能是 Error

最佳答案

最大的区别

assert false;

(不需要括号,assert 不是函数而是语句。)和

throw new RuntimeException();

是可以禁用断言。实际上,它默认情况下是禁用的,除非 JVM 以 -ea(“启用断言”)标志启动。如果启用断言,assert false 将无条件抛出 AssertionError派生自 Error。但是由于可以禁用断言,因此存在两个问题,

  • 错误可能未被发现并且
  • 控制流分析需要在 assert 之后有一个虚拟的 return 语句(这主要是困惑的)。

因此,在上述情况下,我当然会选择明确(且更简洁)

throw new AssertionError("invalid type " + type);

而不是 assert 后跟一个虚拟 return

如评论中所述,这是假设 type 是一个内部参数,无效值表示逻辑本身存在错误。如果它是输入参数,则应根据通常的规则和 IllegalArgumentException 对其进行验证。如果验证失败则抛出。

关于java - 断言(假)与 RuntimeException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28480068/

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