0

入力に応じて変数内に値を格納しようとしています:

switch(pepperoni) {

    case 'Y':
    case 'y':
        topping1 = 1;
        break;

    case 'N':
    case 'n':   
        topping1 = 0;
        break;

    default: 

        {
    System.out.print("This is not a valid response, please try again \n");  
    System.out.print("Do you want Pepperoni? (Y/N): ");
    pepperoni = scan.next().charAt(0);
        break;
    }

変数topping1に、入力が「Y」または「y」の場合は値1を格納し、入力が「N」または「n」の場合は値0を格納するようにします。

入力が「Y」、「y」、「N」、「n」のいずれでもない場合は、有効な入力が入力されるまで質問を繰り返します。

この問題は、プログラムの後半で「初期化されていない可能性があるため」値を出力しようとすると発生します。これはある程度意味があります。(以下の例)

if(topping1 > 0)
    System.out.println("Pepperoni"); 

// 243: error: variable topping1 might not have been initialized

これを行う方法は他にもあると思いますが、Javaを本当に学びたいので、できるだけ多くの基本を理解しようとしています。したがって、なぜこれが機能しないのか、switchステートメントまたはクイックフィックスを使用してこれを行う方法があるかどうかを誰かに教えてもらえれば、本当にうれしいです。

4

4 に答える 4

1

問題はおそらく、switchステートメントがtopping1に設定された値を保証しないことです。'L'の応答を受け取った場合は、1にも0にも設定しません。topping1を初期化するときにデフォルト値を設定するか、default句に1を設定する必要があります。

Javaのコンパイラーは、コードを分析して、設定されるまで人々をループから外さないことを知ることはできません(私はこれがループに入っていると思います)。それは、それが設定されないことを可能にするであろうコードを通るパスがあることを伝えることができるだけです。

これは機能します(スイッチについても同じことが言えます):

int a;
if (condition()) {
  a=0;
} else {
  a=1;
}
System.out.println(a);

そしてこれは機能します:

int a=1;
if (condition()) {
  a=0;
} 
System.out.println(a);

これはしません:

int a;
if (condition()) {
  a=0;
} 
System.out.println(a); // compiler error!

condition()がfalseを返す場合、aは未定義であるためです。ローカル変数を定義する必要があります。これは、デフォルト値のnull、0、またはfalseが自動的に割り当てられるクラスのフィールドとは異なることに注意してください。

于 2013-02-28T23:37:03.777 に答える
0

、、、、または、でpepperoniない場合は、ケースに値が割り当てられないため、に値を割り当てることはありません。たとえば、がこれらの4つの値のいずれでもない場合、制御フローは他の2つのケースをスキップして、に進みます。これは値を与えないため、後で使用しようとすると、値をまったく受け取らなかった可能性があります。YyNntopping1defaultpepperonidefaulttopping1topping1

「回避策」は、ロジックを修正しtopping1て、値を割り当てずに使用しようとしないようにすることです。それをどのように行うかは、私たちに示していないロジックによって異なります。0たとえば、または1(の他のブランチで割り当てる値)以外の値を割り当てることができswitchます。

于 2013-02-28T23:32:05.270 に答える
0

topping1初期化せず、後で変数を参照するswitchステートメントのパスがあるため、「初期化されていない可能性があります」というエラーが発生します。

できること:topping1無効な値(たとえば、-1)に初期化します。次に、の値がまだ-1に等しいwhileかどうかをチェックするループにcaseステートメントを配置します。topping1

次に、whileループから抜けると、次のことが当てはまることがわかります。

  1. 初期topping1化したので、コンパイラエラーは発生しません。
  2. の有効な値がありますtopping1
于 2013-02-28T23:34:29.207 に答える
0

これは少し醜いように見えますが、このようにループを作成することは、コンパイラが文句を言うのを防ぐ1つの方法です。

for (;;) {
    System.out.print("Do you want Pepperoni? (Y/N): ");
    pepperoni = scan.next().charAt(0);
    switch (pepperoni) {

        case 'Y':
        case 'y':
            topping1 = 1;
            break;

        case 'N':
        case 'n':   
            topping1 = 0;
            break;

        default: 
            System.out.println("This is not a valid response, please try again");
            continue;
    }
    break;
}
于 2013-02-28T23:46:22.593 に答える