2

我试图捕获插入文本并且程序必须解析的异常。编译时表示变量 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
4

7 回答 7

4

如果抛出并捕获异常,则变量num不会被初始化

num = Integer.parseInt( choice );

然后会有一个问题:

switch (num) { //what is num in here?

为了解决这个问题 - 您可以为这些情况提供默认值(在异常处理程序中,或在 try 块之前,因此赋值num将覆盖默认值),或者在抛出异常时终止方法。
最简单的解决方案恕我直言(尽管它并不总是适合)将是num在声明它时进行初始化,例如:

int num = MY_DEFAULT_VALUE;
于 2012-05-31T13:58:56.293 回答
0

如果parseInt抛出异常,则不会初始化 num。将其初始化为 catch 块之前的内容。

于 2012-05-31T13:59:21.397 回答
0

问题是你正在这样做:int num;. 您没有为它分配任何价值。在您的do while循环中,您正在填充该值,但这可能会引发异常,这将导致您的变量在到达switch语句时仍然未初始化。我建议您num使用一些初始后备值填充变量,然后在循环中更新该值。

作为另一个建议,我建议您不要吞下异常,并在 catch 部分中为num变量提供一些值,以防异常被捕获。

于 2012-05-31T14:00:17.810 回答
0

将 anum=0;作为隐式默认值放入 catch

于 2012-05-31T14:00:27.233 回答
0

num在 try 块之前初始化。如果从类型转换中抛出任何异常,则num不会初始化。如果可能的话,为了一个好的编程习惯,在使用它之前初始化所有变量。

于 2012-05-31T14:00:48.333 回答
0

这是因为如果抛出异常,您的变量 num 不会用任何值初始化。在这种情况下,所有操作都会失败,因为 num 没有值。如果 num 是方法范围之外的变量,那么它将获得默认值。但是在方法中声明的变量不会收到任何默认值。您可以在抛出异常时为 num 分配一个单独的值,例如 -1,或者在声明它时对其进行初始化。基本上你有很多关于如何处理这个问题的选择。

于 2012-05-31T14:01:14.253 回答
0

替换为

 int num = 0;

这应该可以解决问题

于 2012-05-31T14:01:51.670 回答