未使用局部变量

时间:2013-03-24 22:52:56

标签: java eclipse local-variables palindrome

我试图测试输入的单词是否是回文(相同的拼写向前和向后)。从我可以看到它应该工作,但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 个答案:

答案 0 :(得分:5)

if (isPalindrome = true)应该if (isPalindrome == true)(或 if (isPalindrome) 更好!实际上这个错误是另一个很好的理由,为什么不询问someBoolean == true是{a}坏风格)

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

了解这一点也很好:

  

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

因此,当你执行if (isPalindrome = true)时,if条件总是得到满足。

答案 1 :(得分:2)

您应该为isPalindrome范围内的main分配一些布尔值。

例如:

boolean isPalindrome = true

答案 2 :(得分: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. 不要为布尔值isAnything命名。毕竟,您可以在JavaBean类中执行此操作,然后最终会得到名为isIsAnythinggetIsAnything的方法。这会惹恼你的读者。
  4. 将来,请勿在{{1​​}}方法中编写所有代码。让main方法使用参数来构造类的实例,并使用该实例。这样,您就可以为该类编写单元测试;你不能为主。您可以将代码分解为几种方法。一个检查是回文,而另一个提供人类可读的输出。
  5. 使用main(String[])String.toLowerCase()的无参数形式实际上是一个坏主意。有一天,您可能需要编写一个国际化的应用程序,您将不得不处理土耳其语语言环境。你最终可能会自言自语道:“多么无知我到底是什么?”
  6. 请勿在此处使用String.toUpperCase()i作为变量名称。使用显示变量用途的名称。类似的东西:

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

  7. 毕竟,当j通过start时,你只是在重复自己。

答案 3 :(得分:0)

这里有错误和不良做法。

不良做法不是要初始化变量:

boolean isPalindrome = true;

虽然java中的所有原语都有一个默认值(对于boolean它是假的),但为了增强代码的可重复性,显式初始化varibale仍然总是更好。

错误位于if子句中:

if (isPalindrome = true) {

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