10
private String getWhoozitYs(){
    StringBuffer sb = new StringBuffer();
    boolean stop = generator.nextBoolean();
    if(stop = true)
    {
        sb.append("y");
        getWhoozitYs();
    }
    return sb.toString();
}

这是我在编程课程中正在做的一个项目的一段代码。我遇到的问题是,在声明布尔停止并尝试为其分配一个随机生成的布尔值之后,我无法在 if 语句中使用它来确定是否应该将更多的 y 附加到 StringBuffer 中。我在构造函数中确实有 Random 生成器,所以这部分不是问题。我假设因为我在 if 语句之外声明了布尔值,所以我可以在内部使用它,但似乎并非如此。真正的问题是如何在 if 语句中使用随机确定的布尔值。

4

8 回答 8

27

if(stop = true)应该是if(stop == true),或者只是(更好!)if(stop)

这实际上是一个很好的机会来了解为什么总是使用if(something)如果你想看看它是否true而不是写作if(something == true)(糟糕的风格!)。

通过这样做stop = true,您将分配truestop而不是进行比较。

那么为什么if执行语句下面的代码呢?

参见JLS - 15.26。赋值运算符

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

所以因为你写了stop = true,那么你就满足了if条件。

于 2013-03-14T15:03:59.157 回答
4

这里的问题是

if(stop = true)是分配而不是比较。

尝试if (stop == true)

另请查看Java 程序员犯的十大错误

于 2013-03-14T15:04:44.660 回答
3

实际上,如果您只需要使用 StringBuffer 的一个实例,而不是在每个递归调用中创建一个实例,那么整个方法会更简洁......我会选择:

private String getWhoozitYs(){
     StringBuffer sb = new StringBuffer();
     while (generator.nextBoolean()) {
         sb.append("y");
     }

     return sb.toString();
}
于 2013-03-14T15:15:23.030 回答
2
if(stop == true)

或者

if(stop)

= 用于分配。

== 用于检查条件。

if(stop = true) 

它将分配 true 以停止并评估 if(true)。所以它总是会执行 if 里面的代码,因为 stop 总是被赋值为 true。

于 2013-03-14T15:04:49.143 回答
1

由于stop是布尔值,您可以将该部分更改为:

//...
if(stop) // Or to: if (stop == true)
{
   sb.append("y");
   getWhoozitYs();
}
return sb.toString();
//...
于 2013-03-14T15:04:42.660 回答
1

尝试这个:-

private String getWhoozitYs(){
    StringBuffer sb = new StringBuffer();
    boolean stop = generator.nextBoolean();
    if(stop)
    {
        sb.append("y");
        getWhoozitYs();
    }
    return sb.toString();
}
于 2013-03-14T15:05:03.877 回答
1

= 用于分配

if(stop){
   //your code
}

或者

if(stop == true){
   //your code
}
于 2013-03-14T15:05:56.420 回答
1

另外你可以写

if(stop)
{
        sb.append("y");
        getWhoozitYs();
}
于 2013-03-14T15:06:05.903 回答