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

如果已引发RuntimeException且未捕获,则返回类型值

  •  0
  • Alfred  · 技术社区  · 15 年前

    我正在使用 Gson 解析JSON。我不明白的是,如果你不抓住 Runtime Exception . 我本来以为 null ,但它不是 无效的 当用一个简单的 if 语句。

    我的代码如下所示:

    public X x(final String jsonString) {
       return gson.fromJson(jsonString, X.class);
    }
    

    然后从另一个函数调用该函数:

    public void y() {
      final X x = x();
      if (x == null) {
        System.out.println("x == null");
      }
    }
    

    我本来希望x为空,但这不是因为没有调用print语句吗?价值是什么 x ?我已经通过在 x() 功能和返回 无效的 从挡块内部。但我只是想知道函数的值是多少 () 是(如果有的话)?希望我说得通。

    1 回复  |  直到 15 年前
        1
  •  3
  •   Michael Mrozek    15 年前

    如果 x() 正在引发异常, x 变量保持未初始化状态,因为控制流被中断。如果没有try/catch,异常将继续向上堆栈,并且 X 不可用。通过尝试/接球, X 仅在块内有效,因此如果发生异常,它将不可用。

    如果您尝试执行以下操作:

    X x;
    try {
        x = x();
    } catch(RuntimeException e) {}
    if (x == null) {
        ...
    

    您将得到错误“变量x可能尚未初始化”,因为控制流可以绕过分配