gpt4 book ai didi

Java Optional.orElseThrow 签名解释

转载 作者:行者123 更新时间:2023-11-30 06:44:12 25 4
gpt4 key购买 nike

出于好奇,我查看了 Optional 类方法 orElseThrow,但我对它的签名感到困惑。我不明白为什么必须按原样声明它。因此,我用原始 orElseThrow 方法的副本和我的简化变体做了一个实验:

public class Main<T> {

//This is original signature of Optional.orElseThrow method
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X{

throw exceptionSupplier.get();
}

//This is my attempt to simplify it but it doesn't work without try-catch block
public T orElseThrow2(Supplier<Throwable> exceptionSupplier) throws Throwable{

throw exceptionSupplier.get();
}

public static void main(String[] args){
Main<Object> m = new Main<Object>();

m.orElseThrow(() -> new RuntimeException("ha")); //no warnings/errors shown

m.orElseThrow2(() -> new RuntimeException("sad")); //"Unhandled exception: java.lang.Throwable"
}
  1. 如果没有 try-catch block ,为什么我的方法不被接受?

  2. 为什么像在原始方法中一样扩展 Throwable 不需要
    即使原始方法抛出 Throwable 对象,try-catch
    也会阻塞?







最佳答案






  1. 因为所有编译器都知道你的方法是抛出一个 Throwable。由于 Throwable 因此可能是一个已检查的异常,因此您不得不在 throws 子句中声明它或捕获它。


  2. 因为编译器知道该方法抛出 X,其中泛型 X 被推断为 RuntimeException : () -> new RuntimeException("ha")Supplier<RuntimeException> .根据定义,运行时异常是不需要在 throws 子句中声明的未经检查的异常。









关于Java Optional.orElseThrow 签名解释,我们在Stack Overflow上找到一个类似的问题:

https://stackoverflow.com/questions/50977270/




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