在java中返回boolean时出错

时间:2014-07-27 01:28:23

标签: java

我试图做运动但是卡住了。

此课程会询问用户是否仍然想要回答是或否,并返回boolean

public boolean playAgain() {
    char va;
    boolean t = true;
    boolean ry;
    while (t = true) {
        IO.outputln("Want to play again? (y/n)");
        va = IO.inputCharacter();
        if ((va == 'y') || (va == 'Y')) {
            ry = true;
            t = false;
        } else if ((va == 'n') || (va == 'N')) {
            ry = false;
            t = false;
        }

    }
    return ry;

它给了我下一个错误:

[ERROR] variable ry might not have been initialized.

是否可以从开头分配变量ry没有结果? (因为它将在while循环中分配)

4 个答案:

答案 0 :(得分:3)

我更改了您的代码并添加了一些解释:

public boolean playAgain() {    
    char va;
    // you don't need other variables

    while (true) { // infinite loop ... will only stop if user enters "y" or "n"
                   // you should consider avoiding this loop and take every non "yes" answer as a "no" answer.
        IO.outputln("Want to play again? (y/n)");
        va = IO.inputCharacter();

        if ((va=='y') || (va=='Y')) {
            return true; // instantly return the answer ... no need to stop the loop first
        }
        else if ((va=='n')||(va=='N')) {
            return false; // see above ... instantly return the answer
        }    
    }
}

没有循环(每个答案不是" y"或" Y"将被视为"否"答案):

public boolean playAgain() {    

    IO.outputln("Want to play again? (y/n)");
    char va = IO.inputCharacter();

    if ((va=='y') || (va=='Y')) {
        return true;
    }

    return false;
}

答案 1 :(得分:3)

在输入另一个范围之前,您不会为变量指定任何内容。为了更好地说明这一点,这里是您的代码,带有更清晰的缩进:

public boolean playAgain() {
    char va;
    boolean t = true;
    boolean ry;
    while(t = true) {
        IO.outputln("Want to play again? (y/n)");
        va = IO.inputCharacter();
        if((va == 'y') || (va == 'Y')) {
            ry = true;
            t = false;
        } else if((va == 'n') || (va == 'N')) {
            ry = false;
            t = false;
        }

    }
    return ry;
}

您只需声明ry,但不要将其初始化为任何内容;它的初始化取决于if语句中的某些内容,该语句本身位于while循环内。

当Java编译这样的东西时,它也会考虑分支,即"如果分支,我会记下这个吗?",或者,"如果这个循环永远不会触发会发生什么?"

以这种方式查看您的代码:

public boolean playAgain() {
    char va;
    boolean t = true;
    boolean ry;

    return ry;
}

这是循环的有效删除,如果它永远不会触发"。请注意,我们现在正在返回一个我们尚未初始化为任何内容的变量。这是不可接受的,因此您会收到编译错误,而变量ry可能尚未初始化。"

假设循环可能永远不会触发(尽管在这种情况下,它很简单;您可能希望将其更改为while(t == true)甚至while(t)),并且它看到ry稍后在方法中使用,但没有值。

必须将变量ry初始化为某个值(例如boolean ry = false)。

答案 2 :(得分:3)

你有一个无限循环:while(t = true)。表达式t = true返回分配给t的值(始终 true)。所以我假设你实际上意味着while(t == true) - 这是多余的。你给while一个布尔值(==将返回各种基本类型和指针),所以你应该永远测试布尔值是true还是{{ 1}} - 只需传递变量,例如false(或者如果你想要否定变量while(t))。

其次,如果永远不会输入while循环,那么永远不会为while(!t)赋值 - 这就是编译器抱怨的原因。你,我和其他所有人都知道ry最初是正确的,因此while循环肯定是输入但编译器。简单的解决方案是:

  1. 修复while循环:t
  2. 将初始值分配给while(t) - 无关紧要,因此ryboolean ry = false都可以。
  3. 这是一个示例,说明为什么测试boolean ry = truetrue的布尔值没有意义。以下是否有意义?

    false

    希望很明显这是荒谬的代码。首先,我们测试布尔表达式是public static boolean isUpperCase(final char c){ if( ((c < 'A') == true) || ((c > 'Z') == true) ) return false; else return true; } 还是true,然后我们返回对它的评估。如果不改变测试,最好的方法是:

    false

    使用De Morgan定律,可以使用更简洁的方法:

    public static boolean isUpperCase(final char c){
        return !( (c < 'A') || (c > 'Z') );
    }
    

    P.S。根据Tom的回答,事实上你最初分配的值public static boolean isUpperCase(final char c){ return c >= 'A' && c <= 'Z'; } 并不重要(编译器需要它),这表明有一种更好的方法可以对此进行编码。

答案 3 :(得分:1)

您可以指定false,或者您可以使用布尔值(而不是布尔值)并在开头指定null。