Page 1 of 1

About Question enthuware.ocpjp.i.v11.2.3231 :

Posted: Wed Sep 18, 2019 10:24 am
by sir_Anduin@yahoo.de
lets asume this program

Code: Select all

public static void main(String[] args) {
        switch (1) {
        case 0:
            var b = false;
            break;
        case 1:
            b = true;
            break;
        }
    }
how can

Code: Select all

 var b 
ever be decared?
the scopes of a switch case are messed up, I guess.

Re: About Question enthuware.ocpjp.i.v11.2.3231 :

Posted: Sat Feb 29, 2020 12:32 pm
by FlatPanda
This is a very interesting conundrum, because in a "default" branch, the variable b is not in scope anymore. I haven't found an explicit resolution for this in the JLS, but if I reaaaaaly want, then I can interpret section 16.9.2 (Definite Assignment and Statements / switch Statements) in a way that it fits. I would have expected to find it explicitly in 6.3-2 (Scope of Local Variable Declarations) or in 14.11 (Blocks and Statements / The switch Statement).

The real mindboggling things start here:

Code: Select all

public static void main(String args[]) {
      switch(Integer.parseInt(args[0])) {
          case 0: var b = false; System.out.println(b); 
          case 1: b = true; System.out.println(b);
          default : System.out.println(args);
          case 2: b = false; System.out.println(b);
      } 
    }
Running with 0 it prints: false, true, args@hash, false (with 1: true, args@hash, false) BUT b is not defined in the default branch! i.e., s.o.p(b); is a compile time error in the line of default

@admin: this also means that the explanation text for "Compile time error at line //3", namely "There is no problem here. b is in scope for the rest of the switch block" is semi-correct: it is correct for the exact example given in the question, but 100% correct it would be "There is no problem here. b is in scope for every case-labeled block for the rest of the switch block (not for default though)."

Re: About Question enthuware.ocpjp.i.v11.2.3231 :

Posted: Sat Feb 29, 2020 11:54 pm
by admin
You are right. b is not in score in the default block. I couldn't find anything about it in the JLS either.
Explanation has been updated. thank you for your feedback!

Re: About Question enthuware.ocpjp.i.v11.2.3231 :

Posted: Sun Mar 01, 2020 3:11 am
by FlatPanda
Stop the presses, the first analysis was wrong!

It *is* in scope, but I haven't read the exact error message *facepalm* It says (rightly!) that b might not have been intialized. This is not special to the default case, i.e., this won't work either:

Code: Select all

        switch (Integer.parseInt(args[0])) {
            case 0 : var b = true; System.out.println(b);
            case 1 :               System.out.println(b);
}

Re: About Question enthuware.ocpjp.i.v11.2.3231 :

Posted: Sun Mar 01, 2020 3:34 am
by admin
Horses held. I should have double checked before assuming anything :thumbup: