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...
更新:很抱歉误导了你们中的一些人,这里是更详细的代码:
我正在尝试将 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...