0

入力された単語が回文であるかどうかをテストしようとしています(同じスペルが前後にあります)。私が見る限り、それは機能するはずですが、Eclipseは「ローカル変数isPalindromeの値は使用されていません」と言っていますが、使用されています。問題は、その単語が回文でなくても、回文であると言っていることです。

import java.util.Scanner;

public class Palindrome {
    public static void main(String[] args) {
        String phrase;
        char[] phraseLetters;
        int endChar;
        boolean isPalindrome;

        Scanner input = new Scanner(System.in);
        System.out.println("Enter a word or phrase.");
        phrase = input.nextLine();
        input.close();

        phrase = phrase.toLowerCase();
        phrase = phrase.replaceAll(" ","");
        phraseLetters = phrase.toCharArray();

        endChar = phraseLetters.length - 1;

        for (int i = 0; i < phraseLetters.length; i++) {
            if (phraseLetters[i] != phraseLetters[endChar]) {
                isPalindrome = false;   
            } else {
                isPalindrome = true;
                endChar -= 1;
            }
        }

        if (isPalindrome = true) {
            System.out.println("This word or phrase entered is a palindrome.");
        } else {
            System.out.println("This word or phrase is not a palindrome.");
        }
    }
}

編集:私はifステートメントが

    if (isPalindrome == true) 

    if (isPalindrome)

どちらの場合も、Eclipseは、このif条件で、「ローカル変数isPalindromeが初期化されていない可能性があります」と表示します。

最終編集:

それ以来、私は先に進み、このコードを書き直しましたが、誰かがまだこれを見ている場合は、元のコードに戻って修正しました。

コードの先頭でisPalindromeを初期化しました。

Boolean isPalinddrome = True;

forループ条件を次のように変更しました。

for (int i = 0; (i < phraseLetters.length) && (isPalindrome); i++)

最後に私はに変更if (isPalindrome = true)しましたif (isPalindrome)

4

4 に答える 4

5

if (isPalindrome = true)する必要がありますif (isPalindrome == true)(またはより良いです!実際には、このエラーは、どちらが悪いスタイルであるif (isPalindrome)かを尋ねないもう1つの理由です)someBoolean == true

入力することで、ここでも値を変数にif (isPalindrome = true)割り当てます。また、値を割り当てるだけなので、コンパイラは未使用の変数について警告します。trueisPalindrome

これを知っておくのも良いことです:

実行時に、代入式の結果は、代入が発生した後の変数の値になります。代入式の結果自体は変数ではありません。

したがって、if (isPalindrome = true)そうすると、if条件が常に満たされます。

于 2013-03-24T22:54:33.520 に答える
2

isPalindromeスコープ内でブール値を割り当てる必要がありmainます。

例えば:

boolean isPalindrome = true
于 2013-03-24T23:02:52.480 に答える
1

タイプミスがあります。

if (isPalindrome = true)
{
    System.out.println("This word or phrase entered is a palindrome.");
}
else
{
    System.out.println("This word or phrase is not a palindrome.");
}

if条件を見てください。==の代わりに=を使用しました。したがって、isPalindromeをtrueに設定すると、trueブロックのみが実行され、コンパイラーはそれが重要であるとは認識しisPalindromeません。

今、あなたのクラスにはいくつかの論理的な欠陥といくつかのプログラミングの罠があります。

  1. 最初と最後の文字が等しくない場合、isPalindromefalseに設定され、プログラムは続行されます。ループから抜け出します。後でisPalindrome設定しないでください。trueちなみに、あなたのバージョンは実際には最初と最後の文字だけを気にします。
  2. 書かないでくださいif (x == true)。書くだけif (x)です。
  3. ブール値に名前を付けないでくださいisAnything。結局のところ、これはJavaBeanクラスで行うことができ、そうすると、isIsAnythingまたはという名前のメソッドになりますgetIsAnything。これはあなたの読者を苛立たせます。
  4. main(String[])将来的には、メソッドにすべてのコードを記述しないでください。mainメソッドに引数を使用してクラスのインスタンスを作成させ、そのインスタンスを使用させます。このようにして、クラスの単体テストを作成できます。あなたはメインのためにできません。コードをいくつかのメソッドに分割できます。1つは回文であるかどうかをチェックし、もう1つは人間が読める形式の出力を提供します。
  5. String.toLowerCase()引数のない形式を使用することは実際には悪い考えString.toUpperCase()です。ある日、国際化されたアプリケーションを作成する必要があり、トルコ語のロケールに対処する必要があります。「ドット付きのIとは一体何なのか」とつぶやいてしまうかもしれません。</li>
  6. ここでは、変数名としてiとを使用しないでください。j変数の目的を示す名前を使用してください。何かのようなもの:

    for(int start = 0、end =phraseLetters.length-1; start <end; start ++、end--){...}

結局のところ、startパスするときend、あなたはただ自分自身を繰り返しているだけです。

于 2013-03-24T23:15:20.163 に答える
0

ここにはエラーと悪い習慣があります。

悪い習慣は、variabaleを初期化しないことです:

boolean isPalindrome = true;

Javaのすべてのプリミティブにはデフォルト値がありますが(ブール値の場合はfalseです)、コードの信頼性を高めるために、変数を明示的に初期化することをお勧めします。

エラーはif句にあります:

if (isPalindrome = true) {

この行では、変数をチェックせずに値を割り当てます。すべての割り当ては割り当ての値を返します。これは、この式が常にtrueを返すことを意味します。このため、コードは常にtrueに再実行されます。

于 2013-03-25T07:53:32.330 に答える