【问题标题】:Java try block code does not executeJava try 块代码不执行
【发布时间】:2015-04-14 21:51:58
【问题描述】:

我不明白为什么这个 try 块中的代码不执行。我得到一个编译错误,当我在 try 块之后使用这些变量时,它们可能没有被初始化。

double star, planet, posLife, actLife, intelLife, comm, length;

try{
    star = Double.parseDouble(factor.elementAt(0).getText());    
    planet = Double.parseDouble(factor.elementAt(1).getText());
    posLife = Double.parseDouble(factor.elementAt(2).getText());
    actLife = Double.parseDouble(factor.elementAt(3).getText());
    intelLife = Double.parseDouble(factor.elementAt(4).getText());
    comm = Double.parseDouble(factor.elementAt(5).getText());
    length = Double.parseDouble(factor.elementAt(6).getText());
} catch(NumberFormatException E){ 
    System.err.println("NumberFormatException");
}   

【问题讨论】:

  • 局部变量的范围受{} 大括号的限制。这意味着您将无法访问在其余代码中在try 块中声明的变量(例如在catch 中或在try 之后。但从您提到的错误来看,您似乎隐藏了在try 之前声明的变量重新声明具有相同名称的新变量。在这种情况下,只需删除类型,例如将 double star = ... 更改为 `star = ...` 以避免重新声明。
  • 其实我之前已经在块外声明了变量。我仍然有同样的问题,因为在 try 块中没有进行变量分配。感谢您的帮助,但情况基本没有改变。
  • 好的,我想通了。我曾尝试在 try 块之外声明变量,但奇怪的是我还必须在 try 块之外初始化变量,以允许变量在 try 块内进行赋值。奇怪...

标签: java exception-handling applet try-catch


【解决方案1】:

首先,你在 try 块中定义的变量不应该在 try 块之外可见;所以我相信你在尝试之前必须有另一个double star;等。

现在,我假设您的代码更像以下代码,因为您提供的代码不会发生您所说的错误:

double a;
try {
    a = Double.parseDouble(/* blah */);
} catch (NumberFormatException e) {
    System.err.println("NumberFormatException");
}

这里,在执行这段代码之后,a 可能完全没有初始化。事实上,如果Double.parseDouble 中出现任何错误,对a 的赋值将被跳过以跳转到不返回的catch 块。

因此,在上述代码块之后,a 可能未初始化,因此出现错误消息。

要修复它,您应该删除 try 块内变量之前的类型,并提供默认值以防无法解析双精度,或者如果无法从 中恢复异常这个范围,一开始就不要抓住它。

【讨论】:

    【解决方案2】:

    在尝试访问它们之前,您应该为双打分配一个默认值,我给我的值是-1

    如果您需要在 try-catch 块之后使用它们,则必须在 try-catch 块之前声明您在 try-catch 中使用的变量。

    这是一个例子。

    //Some default value
    double star = -1;
    
    try {
        star = 0;
    } catch(NumberFormatException E){ 
        System.err.println("NumberFormatException");
    }
    
    //You can use this now.
    System.out.println(star);
    

    【讨论】:

    • 哎呀,对不起,我对你投了反对票,因为变量是 nottry 块中声明的,并且编辑历史显示它们没有被声明在问题的原始版本的try 块中,要么 - 但我只是注意到你可能写了这个答案来响应问题的 second 版本,其中变量 try 块中声明。我的错。
    • 从技术上讲,我的代码示例是正确的,您需要将双精度值分配给初始值,请参阅我的其他答案。如果可能,请删除该反对票。 :-)
    • 我意识到这一点,这就是我道歉的原因。 (我对史蒂夫郭的回答做了同样的事情,但由于他仍然忽略了潜在的问题,所以我没有打扰道歉。)除非你的答案被编辑,否则我的投票被锁定 - 顺便说一句,它 应该,因为您应该简单地编辑这个以反映对原始问题的更新,而不是有两个答案。
    • 我已更新此内容以反映更改。下次我会编辑我的答案而不是创建一个新答案,这是有道理的。谢谢凯尔。
    • 没问题。理想情况下,您还应该删除其他答案;在极少数情况下,鼓励就同一问题发布多个答案。 (事实上​​,我认为这是否是曾经可取的。)
    【解决方案3】:

    您提到您已经弄清楚了:“奇怪的是,我还必须在 try 块之外初始化变量......”

    这并不“奇怪”。考虑一下这段代码在运行时可能采用的所有可能路径,包括异常路径。如果你catch 出现异常,会发生什么?程序继续,但try 块中的任何代码都不能保证已被执行。所以你可能有未初始化的变量。我所说的“可能”是指“肯定会”,因为发生异常的事实意味着try 块中的 something 没有完成执行,所以至少,你知道块中发生的最后一条语句没有完成——这意味着length从未分配给

    因此,如果发生异常,您将留下未初始化的 try 块和 length(可能还有其他人,也可能是您的所有 doubles)。

    还请注意,虽然您的问题询问为什么 try 块中的代码“不执行”,但您看到的错误是 compile 错误,说明变量 可能未初始化。如果编译器不能确保一个变量将被初始化,它会抛出这个错误——并且如果你的初始化代码在任何类型的条件执行块中(例如if 语句,或者,如在这种情况下,一个try块),那么编译器当然不能保证该块总是会被执行,所以它不能保证变量会被初始化!

    【讨论】:

      【解决方案4】:

      starplanet 等的范围仅限于 try 块。您需要在 try 块之外和之前声明它们。

      double star = null;
      try {
        star = Double.parseDouble(...
      } catch(NumberFormatException e) {
        ...
      }
      
      System.out.println(star);
      

      【讨论】:

      • 在这里你会得到 OP 提到的错误。因为如果解析失败,star 不会被初始化。
      • 固定,星号默认为空
      • 任何原始数据类型永远不能是null
      猜你喜欢
      • 2019-07-30
      • 1970-01-01
      • 2018-10-22
      • 2011-06-06
      • 2019-03-17
      • 2011-06-26
      • 2014-07-15
      • 1970-01-01
      • 2023-01-25
      相关资源
      最近更新 更多