代码之家  ›  专栏  ›  技术社区  ›  Suma

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

  •  1
  • Suma  · 技术社区  · 8 年前

    我的Scala代码(实现Jackson反序列化器)调用一个总是抛出( DeserializationContext.handleUnexpectedToken ). 如果这是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 回复  |  直到 8 年前
        1
  •  1
  •   Jonas N    8 年前

    编辑2:TLDR&不要紧,也许只是简单地将该函数包装在一个不返回任何内容的函数中?

    我通常通过将异常声明为结果类型来实现这一点。让我用爪哇给你看。应该很容易翻译。

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

    然后我简单地用throw作为前缀:

    throw functionThatAlwaysThrows();
    

    注意这里使用的“throw”从来没有真正“发生”,它只是告诉编译器发生了什么。由于异常是在函数内部引发的,因此如果忘记添加“throw”,则结果不会发生变化。

    通常,编译器的流分析会在您忘记它时通知您;当然不是在完全命令式代码中,但是您的问题似乎涉及到一个无法忽略它的上下文。

    编辑:我现在看到您不是调用的函数的实现者。所以我想我们的想法是简单地把这个函数包装成我所描述的函数。或者它已经声明了一个异常作为返回类型?

    推荐文章