Java异常处理变量未初始化

时间:2012-05-31 13:55:52

标签: java variables exception exception-handling

我正在尝试捕获插入文本且程序必须为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

7 个答案:

答案 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;作为隐式默认值

放入catch中

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

替换为

 int num = 0;

这应该可以解决问题