我的Scala代码(实现Jackson解串器)调用了一个始终抛出(DeserializationContext.handleUnexpectedToken
)的Java函数。如果这将是Scala函数,则其返回类型将为Nothing
,并且在代码不可访问后,编译器将知道该代码。目前,我在函数调用后使用???
进行标记,也可以使用任何throw
来代替,但是也许有更好的方法,一些注释或其他内容?
class XDeserializer extends StdDeserializer[X](classOf[X]) {
def deserialize(p: JsonParser, ctxt: DeserializationContext) = {
if (p.getCurrentToken.equals(JsonToken.VALUE_STRING)) {
/* .... */
} else {
ctxt.handleUnexpectedToken(classOf[X], p)
??? // is there a better way?
}
}
}
答案 0 :(得分:1)
EDIT2:TLDR,没关系,也许只是将该函数包装在一个返回Nothing的函数中?
我通常通过将异常声明为结果类型来做到这一点。让我向您展示Java。应该容易翻译。
RuntimeException functionThatAlwaysThrows() {
throw new WhateverRuntimeException();
}
然后我简单地通过在throw前面加上前缀来使用它:
throw functionThatAlwaysThrows();
请注意,这里使用的“ throw”从不实际“发生”,它只是告诉编译器正在发生的事情。由于异常是在函数内部抛出的,因此如果忘记添加“ throw”,结果不会发生变化。
通常,如果您忘记了编译器的流程分析,它会通知您;当然,不是用完全命令式的代码,而是您的问题似乎是关于一个人们将无法忽略它的上下文。
有一个设计决策来决定将哪种异常类型声明为返回类型;实际上,它不必与引发的异常相关,但是如果引发异常,则可能会减少混乱。当然,适用于已检查和未检查的异常,但是我猜Scala没有已检查的异常。
编辑:我现在看到您不是所调用函数的实现者。因此,我想这个想法是将函数简单地包装到我已经描述的函数中。也许它已经声明了异常作为返回类型?