0

選択した目的の入力と出力に基づいてパラメーターの値を変更するコードのセクションがあります。したがって、以下の例では、球の体積を計算し、ユーザーが入力に使用した単位とユーザーが出力に選択した単位に応じて、それに応じて数値が操作されます。

私の問題は、すべてのifステートメントがfalseを返し、何が選択されているかに関係なく、(elseからの)数値10が通過することです。inputPrefとoutputPrefの値を出力しましたが、これらは「mm」と「cubic cm」(たとえば)とまったく同じように見えますが、ifステートメントではキャプチャされません。

明らかなエラーはありますか?2つの変数「inputPref」と「outputPref」は、それが役立つ場合は共有設定からロードされます。

double volumeBase = 4 * piDouble * radius * radius * radius / 3;

                double volume;
                if(inputPref.equals("mm") || outputPref.equals("cubic cm"))
                {
                    volume = volumeBase / 1000;
                }
                if(inputPref.equals("mm") || outputPref.equals("cubic metres"))
                {
                    volume = volumeBase / 1000000000;
                }
                if(inputPref.equals("cm") || outputPref.equals("cubic mm"))
                {
                    volume = volumeBase * 1000;
                }
                if(inputPref.equals("cm") || outputPref.equals("cubic metres"))
                {
                    volume = volumeBase / 1000000;
                }
                if(inputPref.equals("metres") || outputPref.equals("cubic mm"))
                {
                    volume = volumeBase * 1000000000;
                }
                if(inputPref.equals("metres") || outputPref.equals("cubic cm"))
                {
                    volume = volumeBase * 1000000;
                }
                else
                {
                    volume = 10;
                }
4

5 に答える 5

6

すべてのifステートメント(最初のステートメントを除く)はelse ifステートメントである必要があります。これにより、すべてのオプションから1つだけが選択されます。

現状では、コードはifステートメントを早い段階で評価している可能性がありますが、最後の最後if-elseで上書きされており、ほとんどの場合、が返され10ます。

コメントで指摘されているように、両方の条件が各orステートメントで一致したときにコードを実行するために、&&代わりに使用することも意味している可能性があります。ユーザー入力の場合が問題にならないように、の代わりに使用することも検討してください。||ifelse ifequalsIgnoreCase()equals()

そのはず...

double volumeBase = 4 * piDouble * radius * radius * radius / 3;

double volume;
if(inputPref.equalsIgnoreCase("mm") && outputPref.equalsIgnoreCase("cubic cm")){
    volume = volumeBase / 1000;
}
else if(inputPref.equalsIgnoreCase("mm") && outputPref.equalsIgnoreCase("cubic metres")){
    volume = volumeBase / 1000000000;
}
else if(inputPref.equalsIgnoreCase("cm") && outputPref.equalsIgnoreCase("cubic mm")){
    volume = volumeBase * 1000;
}
else if(inputPref.equalsIgnoreCase("cm") && outputPref.equalsIgnoreCase("cubic metres")){
    volume = volumeBase / 1000000;
}
else if(inputPref.equalsIgnoreCase("metres") && outputPref.equalsIgnoreCase("cubic mm")){
    volume = volumeBase * 1000000000;
}
else if(inputPref.equalsIgnoreCase("metres") && outputPref.equalsIgnoreCase("cubic cm")){
    volume = volumeBase * 1000000;
}
else {
    volume = 10;
}

それでも機能しない場合は、ユーザー入力を読み取っているコードに問題がある可能性があります。

于 2012-11-19T12:06:08.230 に答える
6

最後にあなたelseが音量を設定するのは、そうでない10場合、または最後の音量だけがそれに関連しているためです。前の各の前に置くと、期待どおりに機能する可能性があります。また、いくつかの重複があります(複数回チェックしています)。inputPrefmetrescubic cm ifelseelseifmm

例(ただし、以下も参照):

double volume;
if(inputPref.equals("mm") || outputPref.equals("cubic cm"))
{
    volume = volumeBase / 1000;
}
// v--- Note the `else`
else if(inputPref.equals("mm") || outputPref.equals("cubic metres"))
{
    volume = volumeBase / 1000000000;
}
// ...

また、Lews Therinが指摘し&&ているように、これらのペアごとに次のようにしたいと思います。

// here -------------------vv
if (inputPref.equals("mm") && outputPref.equals("cubic cm"))

いいえ

if (inputPref.equals("mm") || outputPref.equals("cubic cm"))
于 2012-11-19T12:06:11.500 に答える
5

私はあなたが'sを使いたいと思いますelse if、そしてあなたの条件では&&を使用しません||

于 2012-11-19T12:06:27.893 に答える
1

おそらく最後のif失敗しているため、ボリュームにはelse10が割り当てられます。注: elseは最後のifにのみ適用されます。すべてのifの代わりにelse-ifを使用します

if(cond){

}
else if(cond){

}
else{

}
于 2012-11-19T12:06:34.497 に答える
1

私は文字列を捨てて、この種のコードに列挙型を使用しました...

public enum LengthUnit {
  M,
  CM,
  MM
}

public enum VolumeUnit {
  M3,
  CM3,
  MM3
}

TimeUnitのように、同様のユニット間でコンバージョン率を設定することもできます。

長所:

  • ミスタイプもミステリーもありません
  • より速く

短所:

  • 拡張する必要がある場合は、維持するためにいくつかの努力が必要です。
于 2012-11-19T12:09:40.773 に答える