当前位置: 首页 > 面试题库 >

抛出x扩展Exception方法签名

慕震博
2023-03-14
问题内容

阅读的JavaDoc
Optional,我碰到了一个奇怪的方法签名;我一生中从未见过:

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)
                                throws X extends Throwable

乍一看,我想知道通用异常怎么<X extends Throwable>可能发生,因为您不能这样做(here和here)。再三考虑,这开始变得有意义,因为这里只是绑定Supplier…,但是供应商本身确切知道泛型之前应该是什么类型。

但是第二行打给我:

  • throws X 是完整的通用异常类型。

然后:

  • X extends Throwable什么世界呢 是什么意思?
    • X 已绑定在方法签名中。
  • 这将以任何方式解决通用异常限制吗?
  • 为什么不这样做throws Throwable,因为其余的将通过类型擦除来擦除?

和一个不直接相关的问题:

  • 是否要求将此方法捕获为catch(Throwable t),或按提供Supplier的类型捕获?因为无法在运行时检查?

问题答案:

像对待您阅读的任何其他通用代码一样对待它。

这是我在Java
8的源代码中
看到的正式签名:

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X
  • X的上限为Throwable。稍后这将很重要。
  • 我们html" target="_blank">返回一个类型T,其势必会OptionalT
  • 我们期望的Supplier通配符上限为X
  • 我们抛出X(这是有效的,因为X其上限为Throwable)。这在JLS 8.4.6中指定;只要X被视为的子类型Throwable,则其声明在此是有效且合法的。

关于Javadoc的误导存在一个公开的错误。在这种情况下,最好是信任源代码而不是文档,直到该错误被声明为已修复。

至于为什么我们使用throws X而不是throws Throwable
X一定要绑定到Throwable最上层。如果您想要更具体的内容Throwable(运行时,检查的或Error),那么仅仅抛出Throwable将不会给您带来灵活性。

最后一个问题:

是否需要在catch(Throwable t)子句中捕获此方法?

__链下的 某些事物
必须处理异常,例如是try...catch块还是JVM本身。理想情况下,人们希望创建一个Supplier可以最好地传达其需求的异常的绑定。你不必(并且可能应该
不是 )创建一个catch(Throwable t)针对这种情况;
如果您Supplier的类型绑定到需要处理的特定异常,那么最好在catch以后的处理中使用它。



 类似资料:
  • 问题内容: 我有以下课程。 和 我对自定义异常何时应该扩展以及何时必须扩展感到困惑。您能否解释一下直接扩展是否有任何缺点? 谢谢! 问题答案: 不选中RuntimeException,而选中Exception(调用代码必须处理它们)。 如果您 想取消选中 自定义异常,则应扩展 它, 否则请使用扩展它。 对于未经检查的异常,不需要调用代码方法在throws子句中声明在方法执行期间可能抛出但未被捕获的

  • 问题内容: 例如,框架/ JDK中的许多方法可能会抛出 但这未在方法签名中指出(因为这是通常保留给检查异常的做法)。我想证明在方法sigs中声明RuntimeExceptions有很多好处(例如类似于静态类型检查)。我喝醉了还是其他? 问题答案: 我不会在签名中声明未经检查的异常,因为它会误导该API的用户。是否必须显式处理该异常不再明显。 在javadoc中声明它是一种更好的方法,因为它允许某人

  • 问题内容: 所以我正在与Optionals一起工作,并且遇到了一种奇怪的行为。我想知道这是否真的是意向性的“功能”或其他…奇特的… 这是给定的示例:我有一个带有Optional的方法,在其中我要评估另一个Optional的方法。如果其他Optional不存在,我将引发IllegalArgumentException: 现在,如果the 为空的Optional,即使存在,它也会引发IllegalAr

  • 本文向大家介绍C#中的扩展方法,包括了C#中的扩展方法的使用技巧和注意事项,需要的朋友参考一下 扩展方法是静态方法,就像它们是扩展类型的实例方法一样被调用。使用扩展方法,您可以将方法添加到现有类型中,而无需创建新的派生类型,重新编译或修改原始类型。 以下是我们创建的扩展方法。 让我们看一个使用扩展方法的例子。 示例 输出结果

  • 问题内容: 我有这样的方法: 我想抛出一个内。编译器不允许我这样做,因为不允许将我的方法扔在那里。但是我需要抛出一个的子类来进行测试 (我不能抛出Unchecked)。显然这是一个hack,但我需要进行测试。我尝试过EasyMock,但它也不允许我这样做。任何想法如何做到这一点? 谢谢,肖恩·阮 问题答案: 方法1: Alexey Ragozin的这篇文章介绍了如何使用泛型技巧引发未声明的检查异常

  • 问题内容: 我正在尝试使用Java,并想通过Java的客户端/服务器进行测试,以使客户端将自定义类(消息)的简单对象发送到服务器。问题是我一直在服务器端收到ClassNotFoundException。 我认为其余代码似乎还不错,因为其他对象(例如String)可以顺利通过。 我在不同的位置分别有两个不同的netbeans项目,分别用于客户端和服务器。 他们每个人在各自的程序包下都有自己的Mess