我正在尝试捕获插入文本且程序必须为parseInt的异常。 在编译时,它说可能没有初始化变量num。 (第31行) 我无法解释为什么会这样做。
代码如下。提前谢谢。
// Java packages
import javax.swing.JOptionPane;
// program uses JOptionPane
class Help2Gui {
public static void main(String args[]) {
// variable declaration
String choice;
int num;
// read in first number from user as a string
choice =
JOptionPane
.showInputDialog("Help on: \n \t 1. class \n \t 2. object \n \t 3. method \n \t 4. variable \n \t 5. constructor \n \t 6. Quit \n Enter a number from the list above.");
if (choice == null) {
System.exit(0);
}
do { // begin a loop to display initial choice, repeating until 6 is
// entered
// convert numbers from type String to type int
try {
num = Integer.parseInt(choice);
}
catch (NumberFormatException nfe) {
}
switch (num) { // display result for each item entered by user
case 1:
JOptionPane.showMessageDialog(null,
"\n A class is a definition of an object.",
"Java Help System", JOptionPane.PLAIN_MESSAGE);
break;
case 2:
JOptionPane
.showMessageDialog(
null,
"The switch: \n \n switch (expression) { \n case constant: \n statement sequence \n break \n // ... \n } ; ",
"Java Help System", JOptionPane.QUESTION_MESSAGE);
break;
case 3:
JOptionPane
.showMessageDialog(
null,
"The for: \n \n for(init; condition; iteration) \n statement;",
"Java Help System", JOptionPane.INFORMATION_MESSAGE);
break;
case 4:
JOptionPane.showMessageDialog(null,
"The while: \n \n while(condition) statement;",
"Java Help System", JOptionPane.WARNING_MESSAGE);
break;
case 5:
JOptionPane
.showMessageDialog(
null,
"The do-while: \n \n do { \n statement; \n } while (condition);",
"Java Help System", JOptionPane.ERROR_MESSAGE);
break;
case 6:
System.exit(0);
break;
default:
JOptionPane.showMessageDialog(null,
"Enter a number from 1 to 5 or 6 to Quit",
"Java Help System", JOptionPane.ERROR_MESSAGE);
}
// read in first number from user as a string
choice =
JOptionPane
.showInputDialog("Help on: \n \t 1. if \n \t 2. switch \n \t 3. for \n \t 4. while \n \t 5. do-while \n \t 6. Quit \n Enter a number from the list above.");
try {
// attempt to convert the String to an int
num = Integer.parseInt(choice);
}
catch (NumberFormatException nfe) {
JOptionPane.showMessageDialog(null,
"Enter a number from 1 to 5 or 6 to Quit",
"Java Help System", JOptionPane.ERROR_MESSAGE);
}
// convert numbers from type String to type int
}
while (num != 6); // end of do-while loop.
System.exit(0); // terminate application with window
} // end method main
} // end class Help2Gui
答案 0 :(得分:4)
如果抛出并捕获异常,则
不会初始化变量num
num = Integer.parseInt( choice );
然后会出现问题:
switch (num) { //what is num in here?
要解决此问题 - 您可以为这些情况提供默认值(在异常处理程序中,或在try块之前,因此对num
的赋值将覆盖默认值),或者在此时终止方法抛出异常。
最简单的解决方案恕我直言(虽然它并不总是适合)将在声明它时初始化num
,如:
int num = MY_DEFAULT_VALUE;
答案 1 :(得分:0)
如果parseInt
抛出异常,则不会初始化num。在catch块之前将其初始化为某些内容。
答案 2 :(得分:0)
问题是你这样做:int num;
。您没有为其分配任何值。在do while
循环中,您正在填充值,但这可能会抛出一个异常,这会导致变量在到达switch
语句时仍未初始化。我建议你使用一些初始的回退值填充num
变量,然后更新循环中的值。
作为另一个建议,我建议您不要吞下异常,并且在catch部分中,如果发现异常,则为num
变量提供一些值。
答案 3 :(得分:0)
将num=0;
作为隐式默认值
答案 4 :(得分:0)
在try块之前初始化num
。如果从类型转换中抛出任何异常,则不会初始化num
。而且如果可能的话,对于一个好的编程实践,在使用它之前初始化所有变量。
答案 5 :(得分:0)
这是因为如果抛出异常,则不会使用任何值初始化变量num。在这种情况下,所有操作都将失败,因为num将没有值。如果num是方法范围之外的变量,那么它将获得默认值。但在方法内声明的变量不会收到任何默认值。抛出异常时,可以为num分配一个单独的值,如num,或者在声明异常时初始化它。基本上你有很多关于如何处理它的选项。
答案 6 :(得分:0)
替换为
int num = 0;
这应该可以解决问题