阅读的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
。稍后这将很重要。T
,其势必会Optional
的T
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