我试图做运动但是卡住了。
此课程会询问用户是否仍然想要回答是或否,并返回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循环中分配)
答案 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循环肯定是输入但编译器不。简单的解决方案是:
t
while(t)
- 无关紧要,因此ry
或boolean ry = false
都可以。这是一个示例,说明为什么测试boolean ry = true
或true
的布尔值没有意义。以下是否有意义?
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。