使编译器知道Java函数永不返回

时间:2018-07-30 10:13:37

标签: scala exception

我的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?
      }
    }
  }

1 个答案:

答案 0 :(得分:1)

EDIT2:TLDR,没关系,也许只是将该函数包装在一个返回Nothing的函数中?

我通常通过将异常声明为结果类型来做到这一点。让我向您展示Java。应该容易翻译。

RuntimeException functionThatAlwaysThrows() {
    throw new WhateverRuntimeException();
}

然后我简单地通过在throw前面加上前缀来使用它:

throw functionThatAlwaysThrows();

请注意,这里使用的“ throw”从不实际“发生”,它只是告诉编译器正在发生的事情。由于异常是在函数内部抛出的,因此如果忘记添加“ throw”,结果不会发生变化。

通常,如果您忘记了编译器的流程分析,它会通知您;当然,不是用完全命令式的代码,而是您的问题似乎是关于一个人们将无法忽略它的上下文。

有一个设计决策来决定将哪种异常类型声明为返回类型;实际上,它不必与引发的异常相关,但是如果引发异常,则可能会减少混乱。当然,适用于已检查和未检查的异常,但是我猜Scala没有已检查的异常。

编辑:我现在看到您不是所调用函数的实现者。因此,我想这个想法是将函数简单地包装到我已经描述的函数中。也许它已经声明了异常作为返回类型?