1

これが私のコードです:

import java.util.Scanner;

public class empMod

{
public static void main(String[] args)
    {
    int choice;

    Scanner input = new Scanner(System.in);

    do
        {
        choice = -1;
        System.out.println("Employee Data:");
        System.out.println("1. - Employee Name:");
        System.out.println("2. - Employee Hire Date:");
        System.out.println("3. - Employee Address:");
        System.out.println("4. - Employee Number:");
        System.out.println("5. - Exit");

        choice = input.nextInt();
        input.nextLine();

        switch (choice)
            {
            case 1:

            String empName = new String ();
            System.out.println("Enter the name of the employee:");
            String name = input.nextLine();
            break;

            case 2:

            String empDate = new String ();
            System.out.println("Enter the hire date of the employee:");
            String date = input.nextLine();
            break;

            case 3:

            String empAddress = new String ();
            System.out.println("Enter the address of the employee:");
            String address = input.nextLine();
            break;

            case 4:

            String empNumb = new String ();
            System.out.println("Enter the Employee number:");
            int number = input.nextInt();
            break;

            case 5:

            System.out.print("\n");
            System.out.println("The name of the employee is: " + empName); // <-- This is the line where the error occurs.
            break;

            default:
            continue;
            }

        }
    while (choice != 6);
    } 
}

このプログラムの目的は、従業員に関する情報をユーザーに入力させ、要求に応じて情報を表示させることです。プログラムをコンパイルしようとすると、次のエラーが発生します。

empMod.java:57: error: variable empName might not have been initialized
                                System.out.println("The name of the employee is:
 " + empName);

     ^

ただし、文字列変数は別のケースで初期化されるため、問題はわかりません。

4

4 に答える 4

2

empName 変数はcase 1セクションでのみ初期化されます。case 5では、このブロックが実行されず、セクションが実行された場合はどうなるでしょうか? 変数は何にも初期化されていないので、何が表示されるでしょうか?

追加

String empName = "";

ループ前。

于 2013-08-31T16:17:14.833 に答える
1

switch (choice)そして、case後で、switch(choice) の値に応じて、いずれかが選択されることを意味しますcase。になる場合5、変数は初期化されません。

empName使用する前switchに初期化する必要がありますcase

使用すべきではありませんString empName = new String ();が、String empName = "";文字列プールを使用します。

于 2013-08-31T16:15:24.860 に答える
0

switchブロックにはスコープが含まれます。そのスコープで宣言された変数は、そこでのみ使用できます。switchを複数のと考えてくださいif-else。変数を初期化するif(the case) が実行されない場合、初期化されていない変数が残ります。それがコンパイラが不平を言っていることです。

case 5:
    System.out.print("\n");
    System.out.println("The name of the employee is: " + empName); // <-- This is the line where the error occurs.
    break;

empName実行がすべてのケースを通過した場合にのみ初期化されます (つまり、choice値が 1 で、ケースにブレークがありませんでした)。しかし、コンパイラはこれを確認できません。

これを修正する方法はempName、ブロックの外側で変数を宣言しswitchて、そのスコープがメソッド スコープであり、switch. コンパイラが初期化されていることを認識できるように、デフォルト値に初期化する必要があります。

String empName = "Not a Name";
于 2013-08-31T16:17:58.930 に答える