2

テキストが挿入され、プログラムが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
4

7 に答える 7

4

例外がスローされてキャッチされた場合、変数numはによって初期化されません

num = Integer.parseInt( choice );

次に、次の問題が発生します。

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

これを解決するには、これらの場合のデフォルト値を指定するか(例外ハンドラー内、またはtryブロックの前に、への割り当てがnumデフォルト値をオーバーライドする)、または例外がスローされたときにメソッドを終了します。
最も単純な解決策IMHO(常に適合するとは限りませんが)はnum、次のように、宣言しながら初期化することです。

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

例外をスローした場合parseInt、numは初期化されません。キャッチブロックの前に何かに初期化します。

于 2012-05-31T13:59:21.397 に答える
0

問題は、これを実行していることですint num;。あなたはそれに値を割り当てていません。ループ内で値を入力していますが、これにより例外がスローされ、ステートメントdo whileに到達したときに変数がまだ初期化されていない可能性があります。変数に初期のフォールバック値を入力してから、ループ内で値を更新するswitchことをお勧めします。num

別の推奨事項として、例外を飲み込まないことをお勧めしますnum。例外がキャッチされた場合は、catchセクション内で変数に値を指定します。

于 2012-05-31T14:00:17.810 に答える
0

num=0;暗黙のデフォルトとしてキャッチに入れます

于 2012-05-31T14:00:27.233 に答える
0

numtryブロックの前に初期化します。型変換から例外がスローされた場合、は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 に答える