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

This is a chunk of code for a project I'm doing in a programming course. The problem I'm having is that after declaring the boolean stop and trying to assign a randomly generated boolean value to it, I can't use it in the if statement to determine if I should append more y's to the StringBuffer or not. I do have the Random generator inside a constructor, so that part isn't a problem. I assumed that since I declared the boolean outside the if statement I would be able to use it inside, but that doesn't seem to be the case. The real question is how can I use a randomly determined boolean in an if statement.

2
  • Hey i think you may figure this one out, it's a nice puzzle.. look up casting. esp. 0 and 1 Commented Mar 14, 2013 at 15:04
  • 1
    Also, you can simply say if(stop) See this - stackoverflow.com/questions/3793650/… Commented Mar 14, 2013 at 15:05

8 Answers 8

27

if(stop = true) should be if(stop == true), or simply (better!) if(stop).

This is actually a good opportunity to see a reason to why always use if(something) if you want to see if it's true instead of writing if(something == true) (bad style!).

By doing stop = true then you are assigning true to stop and not comparing.

So why the code below the if statement executed?

See the JLS - 15.26. Assignment Operators:

At run time, the result of the assignment expression is the value of the variable after the assignment has occurred. The result of an assignment expression is not itself a variable.

So because you wrote stop = true, then you're satisfying the if condition.

Sign up to request clarification or add additional context in comments.

9 Comments

Actually, it should just be if (stop). That's not even open to misinterpretation due to typos. :P
the if is still comparing, it's just since stop gets set to true, it will always evaluate to true. sorry this is a nitpick but it seems like something worth explaining (since the OP is a beginner).
One doubt... if(stop) and if(stop == true) does second one need extra cpu cycles for execution. Programatically both interprete same, then why is it bad to use?
@unknown No complexity difference between the two. It's just like asking "Is it true that the variable is true" instead of "Is the variable true".
@MarounMaroun yes but at cpu instruction level I doubt that is the case. Because "is it true that the variable is true" has 2 conditions I think. Do you have any document or something for it?
|
5

The problem here is

if (stop = true) is an assignment not a comparison.

Try if (stop == true)

Also take a look at the Top Ten Errors Java Programmers Make.

Comments

3

Actually, the entire approach would be cleaner if you only had to use one instance of StringBuffer, instead of creating one in every recursive call... I would go for:

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

Comments

2
if(stop == true) 

or

if(stop) 

= is for assignment.

== is for checking condition.

if(stop = true) 

It will assign true to stop and evaluates if(true). So it will always execute the code inside if because stop will always being assigned with true.

Comments

1

Since stop is boolean you can change that part to:

//... if(stop) // Or to: if (stop == true) { sb.append("y"); getWhoozitYs(); } return sb.toString(); //... 

Comments

1

Try this:-

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

Comments

1

= is for assignment

write

if(stop){ //your code } 

or

if(stop == true){ //your code } 

Comments

1

additionally you can just write

if(stop) { sb.append("y"); getWhoozitYs(); } 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.