0

Programming noob here. I'm trying to write a simple program to randomly generate a tic-tac-toe board, display the Xs and Os, and then determine the outcome of the game. My problem is that when I place the String variables in curly brackets in the if/else statements it's telling me they haven't been initialized. Namely, it says variables s11, s13, s21, s22, s31, s32, and s33 haven't been initialized. Yet s12 and s23 are initialized and the only difference I can see is that they aren't in curly brackets. Where have I erred? Thanks.

import java.util.Random; public class Lab7 { public static void main(String[] args) { int b11, b12, b13, b21, b22, b23, b31, b32, b33; int x, o; String s11, s12, s13, s21, s22, s23, s31, s32, s33; x = 0; o = 0; Random r = new Random(); b11 = r.nextInt(3); b12 = r.nextInt(3); b13 = r.nextInt(3); b21 = r.nextInt(3); b22 = r.nextInt(3); b23 = r.nextInt(3); b31 = r.nextInt(3); b32 = r.nextInt(3); b33 = r.nextInt(3); if ((b11 == b12) && (b12 == b13)) if (b11 == 0) { o = o+1; s11 = "O"; } else if (b11 == 1) { x = x+1; s11 = "X"; } else s11 = ""; if ((b21 == b22) && (b22 == b23)) if (b21 == 0) { o = o+1; s21 = "O"; } else if (b21 == 1) { x = x+1; s21 = "X"; } else s21 = ""; if ((b31 == b32) && (b32 == b33)) if (b31 == 0) { o = o+1; s31 = "O"; } else if (b31 == 1) { x = x+1; s31 = "X"; } else s31 = ""; if ((b11 == b21) && (b21 == b31)) if (b11 == 0) o = o+1; else if (b11 == 1) x = x+1; if ((b32 == b22) && (b22 == b12)) if (b32 == 0) { o = o+1; s32 = "O"; } else if (b32 == 1) { x = x+1; s32 = "X"; } else s32 = ""; if ((b33 == b23) && (b23 == b13)) if (b33 == 0) { o = o+1; s33 = "O"; } else if (b33 == 1) { x = x+1; s33 = "X"; } else s33 = ""; if ((b22 == b11) && (b22 == b33)) if (b22 == 0) { o = o+1; s22 = "O"; } else if (b22 == 1) { x = x+1; s22 = "X"; } else s22 = ""; if ((b13 == b22) && (b22 == b31)) if (b13 == 0) { o = o+1; s13 = "O"; } else if (b13 == 1) { x = x+1; s13 = "X"; } else s13 = ""; if (b12 == 0) s12 = "O"; else if (b12 == 1) s12 = "X"; else s12 = ""; if (b23 == 0) s23 = "O"; else if (b23 == 1) s23 = "X"; else s23 = ""; System.out.println(s11+" "+s12+" "+s13); System.out.println(s21+" "+s22+" "+s23); System.out.println(s31+" "+s32+" "+s33); } } 
6
  • 5
    Consider all the paths execution can take. Commented Oct 9, 2013 at 17:56
  • s12 and s23 chains of if/else always lead to an assignation. Commented Oct 9, 2013 at 17:57
  • 1
    Even if you could prove that for all paths, all variables that are used have been assigned earlier in that path (I didn't check, too much code), the initialization checker in java is pretty simple and rather pessimistic. If you're sure, just initialize to null or something. Commented Oct 9, 2013 at 17:58
  • If b11 != b12 then what is s11? etc... Commented Oct 9, 2013 at 17:59
  • Documentation for Variables might be a good source to freshen up on. Specifically the section regarding Default Values for Local Variables. Commented Oct 9, 2013 at 18:07

7 Answers 7

1

Use

String s11="", s12="", s13="", s21="", s22="", s23="", s31="", s32="", s33=""; 

instead of

String s11, s12, s13, s21, s22, s23, s31, s32, s33; 
Sign up to request clarification or add additional context in comments.

Comments

1

This is because your variables might not get initialized, depending on the conditionals your code takes.

Just put a null value in all of them and your code should be good to go.

But remember that using == operator to compare two String objects may fail.

Comments

0

If the conditions of the if expressions are false, the sxx variables won't be initialized. They must always be initialized. You can simply initialize them to null or to an empty String.

Comments

0

They're declared, but not necessarily initialized. In order to eliminate that compile error, they have to be initialized in every possible path through the code. The easiest way to accomplish this is to simply set your String values to null or "" when you declare them, ie

String s11 = null; 

or

String s11 = ""; 

Comments

0

The compiler recognizes that in any case s12 and s23 get assined a value. For the others he don't and they need a value before they can be used. Just write to initialize every variable.

String s11=""; String s12=""; ... 

Comments

0

The error mean that depending on the input those variables may not be initialise.

for example if ((b13 == b22) && (b22 == b31)) it could result false and s13 will not be initialised.

going with String s11 = "", s12 ="" . . . .; will solve the problem but could cause logical error that you can check later. go for it for now.

Comments

0

With nested if statements a dangling else belongs to the inner if, not to both of then. For example, if b11 does not equal b12 nothing gets assigned to s11. The easy solution is this:

if ((b11 == b12) && (b12 == b13)) { if (b11 == 0) { o = o+1; s11 = "O"; } else if (b11 == 1) { x = x+1; s11 = "X"; } else { s11 = ""; } } else { s11 = ""; } 

Also, use braces whe the parts of an if-statement spans multiple lines.

1 Comment

Thanks so much. I need to learn to keep things like this in mind.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.