Java NumberFormatException 如果被捕获则停止工作

Java NumberFormatException stops working if caught

更新:很抱歉误导了你们中的一些人,这里是更详细的代码:

我正在尝试将 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].

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

设置 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;
}

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

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

并且如果您在 TRY 块之外声明 x以便您可以在 CATCH 内部或 TRY 块外部使用它)那么您已经初始化了它(ofcourse with value as 0 or -1) then x=0 or x=-1 should be expected value of x

您关心的问题:

I want to catch the exception to pass the message to the JLabel.

考虑以下方法,您可以在其中捕获异常、计算错误消息,然后 passing/setting 进入您的标签字段等。

与其他方法相比,此方法的优点 是您需要具有 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...