当前位置: 首页 > 知识库问答 >
问题:

构建异常是否比构建异常供应商慢?[副本]

黄信厚
2023-03-14

原始关闭原因未解决

为什么我们要这样写呢?创建异常实例是否比创建供应商实例更昂贵?

var value = getOptional().orElseThrow(NullPointerException::new);
// instead of
var value = getOptional().orElseThrow(new NullPointerException());

共有1个答案

申屠涛
2023-03-14

。OrelsThrow(NullPointerException::new)相当于()-

这是一个只有在可选项为空时才会调用的函数

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
    if (value != null) {
        return value;
    } else {
        throw exceptionSupplier.get(); // Only invoke on this path
    }
}

代码

优于. orElseThrow(new NullPointerExcsion())的原因是性能。当您传递一个函数时,如果您真的需要抛出它,您只是按需创建一个异常。

相对而言,创建大多数异常是昂贵的。构造函数几乎总是会创建一个堆栈跟踪,并且构造堆栈跟踪相对较慢*。堆栈跟踪的收集是在Throwable的构造函数中完成的。

public Throwable() {
    fillInStackTrace();
}

有一个变体构造函数不会收集堆栈跟踪,但很少使用。

他们本可以提供第二个签名,让人们在它们之间进行选择,但是你建议的签名很可能会经常被误用,导致性能下降。

"贵"和"慢"是相对的术语。"现代CPU速度很快。虽然它可能比大多数正常操作慢得多,但它通常不会成为大多数应用程序或类似操作的瓶颈。

 类似资料:
  • 我对工作室很陌生, 我正在尝试运行我的应用程序 遇到错误- 哪里出错了: 任务': app: dexDebug'执行失败。 com . Android . ide . common . Process . Process exception:org . grad le . Process . internal . exec exception:Process ' command '/Library

  • 我试图为android构建一个离子应用程序,但我遇到了这个错误: 我试图更新科尔多瓦和科尔多瓦-CLI,但没有工作。

  • 当面对选择抛出异常的类型时,您可以使用由别人编写的异常 - Java平台提供了许多可以使用的异常类 - 或者您可以编写自己的异常类。 如果您对任何以下问题回答“是”,您应该编写自己的异常类;否则,你可以使用别人的。 你需要一个Java平台中没有表示的异常类型吗? 如果用户能够区分你的异常与由其他供应商编写的类抛出的异常吗? 你的代码是否抛出不止一个相关的异常? 如果您使用他人的例外,用户是否可以访

  • 问题内容: 每次尝试为Android构建游戏时,都会出现以下错误: 有任何想法吗?我很沮丧 我重新下载了SDK,但没有帮助。 问题答案: 在资源管理器中找到您的Android SDK副本 转到并选择一个版本(例如) 复制 回来吧 进去 糊

  • 在SpringBoot项目中,谁使用maven。找不到类 我绒球的一部分 项目结构 当我启动应用程序时,我得到了这个错误 错误:无法找到或加载主类com.acme.pay.ms.BillingServiceApplication导致:java.lang.ClassNotFoundExc0019:com.acme.pay.ms.BillingServiceApplication命令执行失败。 无法执