【问题标题】:Java NumberFormatException stops working if caught如果被捕获,Java NumberFormatException 将停止工作
【发布时间】:2016-01-13 03:33:29
【问题描述】:

更新:抱歉误导了你们,这里有更详细的代码:

我正在尝试将 String[] 数组解析为 int[] 数组。我从JTextArea 获取字符串,生成String[],然后生成int[]

      array1String="asd, lala, 22";
      array2String="1,2,3";

      String [] arr1 = array1String.split(",");
      String [] arr2 = array2String.split(",");

      int[] array1 = new int[arr1.length];
      for (int i=0; i<arr1.length; i++) {
       try {
           array1[i] = Integer.parseInt(arr1[i]);
          } catch (Exception ex) {
            resultLabel.setText(ex.getMessage());
          }
       }

       int[] array2 = new int[arr2.length];
       for (int i=0; i<arr2.length; i++) {
           try {
              array2[i] = Integer.parseInt(arr2[i]);
           } catch (Exception ex) {
              resultLabel.setText(ex.getMessage());
           }
        }

parseInt() 方法将任何乱码解释为“0”。因此,我没有得到异常,而是将与乱码 String[] 成员对应的每个 int[] 成员都设为零。但这不是我想要的。我想捕获异常以将消息传递给 JLabel。我不希望它愉快地吃任何废话并使其“0”。我错过了什么吗?我怀疑这不是应该的工作方式。

结果数组看起来像

array1 [0,0,22]
array2 [1,2,3].

标签什么也没有,好像从未发生过异常。由于我没有更改代码,只处理了更改的异常。

【问题讨论】:

  • 旁注:你不应该在你的 catch 子句中真正捕捉到Exception,而是NumberFormatException,这是你在这种情况下的预期异常。
  • parseInt() 方法将任何“乱码”解释为 0 是什么意思?那不是真的。如果输入 String 包含除数字以外的任何内容(第一个字符为负号除外),它将抛出 NumberFormatException
  • @Emptyfruit 澄清了很多。虽然现在这给您留下了一个逻辑问题:int 的默认值是 0,但 int 没有 undefined-值。最简单的解决方案:使用Integer[] 代替int[] 并使用null 作为未定义值
  • @Emptyfruit 最简单的方法是打印到消息,然后调用 System.exit(0) 以完全终止应用程序。虽然这也会关闭UI。这在很大程度上取决于您要如何终止程序以及程序本身的工作方式。如果您只想停止解析,只需在打印消息后添加return-statement

标签: java exception-handling numberformatexception


【解决方案1】:

缺少设置JLabel 文本的代码,但我猜它在try-catch-block 之后,并且将简单地使用x 的值,默认为0。解决这个问题最好的办法是像这样更新 try-catch-block 中的文本:

try{
    int x = ...
    resultLabel.setText("" + x);
}catch(Exception ex){
    resultLabel.setText(ex.getMessage());
}

一般来说,如果生成数据可能会抛出异常,建议在生成数据的 try-catch-block 内处理数据。

编辑:
这段代码有一个简单的问题:int 没有像 undefined 值这样的属性。最简单的方法是使用Integer[]null 作为undefined-value:

Integer x;
try{
    x = ...;
}catch(Excpetion ex){
    resultLabel.setText(ex.getMessage());
    x = null;
}

【讨论】:

  • resultLabel.setText("" + x); 怎么可能在 try-catch 之后,因为 x 在 try-catch 之后超出了范围?
  • 当然我在 catch 块中设置了标签文本。这是我唯一可以获得异常信息的地方。
  • @ouah 正如我在帖子中所说:“我 guess ...”尽管操作代码只是代表实际代码的简单存根,但很明显,否则op 也无法使用他的代码。
  • 为什么要更新 CATCH 块内的标签,如果这样做,则需要为 resultLabel.setText 复制代码 - 一个代表成功,一个代表失败..
  • @Emptyfruit 重点不在于您设置标签以显示错误消息的位置,而是您显示从输入字符串解析的值的位置。虽然它会简化很多事情,但如果您发布所有相关代码而不是几行
【解决方案2】:

首先,如果您在 TRY 块中使用 int x = Integer.parseInt(str);,则这意味着您的 x 成为 TRY 块的局部变量,您不能在 TRY 之外使用它,甚至在 CATCH 块中也不能使用。因此,如果出现异常,x=0 的问题甚至不会出现,因为x 将失去其作用域。

如果您在 TRY 块之外声明 x以便您可以在 CATCH 或 TRY 块之外使用它),那么您已经对其进行了初始化(当然值为 0或 -1) 那么 x=0x=-1 应该是 x 的预期值

您的担忧:

我想捕获异常以将消息传递给 JLabel。

考虑以下方法,您将在其中捕获异常,计算错误消息,然后传递/设置到您的标签字段等。

与其他方法相比,此方法的优点是您需要有 resultLabel.setText() 的重复代码,您正在使用成功消息或失败消息更新您的 labelMessage 并使用它。

如果这不能完全解决您的问题,请随时告诉我。

    String labelMessage = null;
    String str = "asd";
    try {
        int x = Integer.parseInt(str);
        labelMessage = //Whatever you want...
    } catch (NumberFormatException e) {
        e.printStackTrace();
        labelMessage = "Error message = " + e.getMessage();  // OR some other menaingful message you want
    }
    //Set to you label field...

【讨论】:

    【解决方案3】:

    int 的默认值为 0。由于您得到一个异常并且没有为 x 分配任何内容,因此您得到 0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      • 1970-01-01
      • 2014-11-25
      相关资源
      最近更新 更多