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)更好!实际上这个错误是另一个很好的理由,为什么不问someBoolean == true哪个是不好的风格)

通过键入if (isPalindrome = true),您再次将值分配给true变量isPalindrome。而且由于您只是为其分配值,因此编译器会警告您未使用的变量

知道这一点也很好:

在运行时,赋值表达式的结果是赋值发生后变量的值。赋值表达式的结果本身不是变量。

因此,当您这样做时,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. 如果第一个和最后一个字符不相等,isPalindrome则设置为 false,然后程序继续。跳出循环;不要让isPalindrome设置为true以后。顺便说一句,您的版本实际上只关心第一个和最后一个字符。
  2. 不要写if (x == true)。就写吧if (x)
  3. 不要命名你的 boolean isAnything。毕竟,您可以在 JavaBean 类中执行此操作,然后您将得到一个名为isIsAnythingor的方法getIsAnything。这会惹恼你的读者。
  4. 将来,不要在main(String[])方法中编写所有代码。让 main 方法使用参数来构造类的实例,并使用该实例。这样,您可以为该类编写单元测试;你不能主要。您可以将代码分解为几种方法。一个检查是否是回文,而另一个提供人类可读的输出。
  5. 使用和的无参数形式实际上是一个坏主意。String.toLowerCase()String.toUpperCase()一天,您可能需要编写一个国际化的应用程序,并且您将不得不处理土耳其语语言环境。你最终可能会自言自语,“无点的 i 到底是什么?”</li>
  6. 不要在这里使用ij作为变量名。使用显示变量用途的名称。就像是:

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

毕竟,当start通过时end,您只是在重复自己。

于 2013-03-24T23:15:20.163 回答
0

这里有一个错误和不好的做法。

不好的做法是不初始化变量:

boolean isPalindrome = true;

尽管 java 中的所有原语都有一个默认值(对于布尔值,它是 false),但为了增强代码可重复性,显式初始化变量总是更好的。

错误在if 子句中:

if (isPalindrome = true) {

在这一行中,您分配值而不检查变量,所有分配都返回分配的值,这意味着该表达式将始终返回 true。因此,您的代码始终返回 true。

于 2013-03-25T07:53:32.330 回答