Variables in different switch cases can't have the same name?

java, switch-statement, syntax-error, variables

Solution

How about not declaring the variables at all?

switch (tokensLeft) {
    case 3:
        rawListener.binaryInfo(
                tokens.nextToken(),
                parseInt(tokens.nextToken()),
                tokens.nextToken(),
                this);
        break;
    case 2:
        rawListener.binaryInfo(
                tokens.nextToken(),
                parseInt(tokens.nextToken()),
                this);
        break;
    default:
        throw new IllegalArgumentException("Method call binaryInfo could not be done because: \"Wrong number of parameters\"");
}

I added a `static` import for `Integer.parseInt`.

Better yet call your logic in well named methods from the `switch` and declare whatever variables you want:

public void parseTokens() {
    switch (tokensLeft) {
        case 3:
            parseThreeTokens(rawListener, tokens);
            break;
        case 2:
            parseTwoTokens(rawListener, tokens);
            break;
        default:
            throw new IllegalArgumentException("Method call binaryInfo could not be done because: \"Wrong number of parameters\"");
    }
}

public void parseThreeTokens(final RawListener rawListener, final Tokens tokens) {
    final String id = tokens.nextToken();
    final String value = tokens.nextToken();
    final String trailerId = tokens.nextToken();
    rawListener.binaryInfo(id, parseInt(value), trailerId, this);

}

public void parseTwoTokens(final RawListener rawListener, final Tokens tokens) {
    final String id = tokens.nextToken();
    final String value = tokens.nextToken();
    rawListener.binaryInfo(id, parseInt(value), this);
}

Problem

I was refactoring some code to make it easier to read and I ran into something that I find weird and I was wondering if anyone could explain this to me. Original code: ``` if(tokensLeft == 3) { String id = tokens.nextToken(); String value = tokens.nextToken(); String trailerId = tokens.nextToken(); rawListener.binaryInfo(id, Integer.parseInt(value), trailerId, this); } else if(tokensLeft == 2) { String id = tokens.nextToken(); String value = tokens.nextToken(); rawListener.binaryInfo(id, Integer.parseInt(value), this); } else { System.out.println("Method call binaryInfo could not be done because: \"Wrong number of parameters\""); } ``` After refactoring: ``` switch(tokensLeft) { case 3: String id = tokens.nextToken(); String value = tokens.nextToken(); String trailerId = tokens.nextToken(); rawListener.binaryInfo(id, Integer.parseInt(value), trailerId, this); break; case 2: String id = tokens.nextToken(); // Syntax error String value = tokens.nextToken(); // Syntax error rawListener.binaryInfo(id, Integer.parseInt(value), this); break; default: System.out.println("Method call binaryInfo could not be done because: \"Wrong number of parameters\""); break; } ``` At first glance this looks perfectly reasonable, but this gives me a syntax error. Link all references for a local rename (does not change references in other files) It turns out that for some reason in a switch statement, I am unable to use the `String id` and `String value` again in a different case. This makes naming my variables rather awkward. Now you could say: "Just declare your variables above your switch statement." But that would mean that I always create my variables, even if `tokensLeft` is neither 3 or 2 and I wouldn't need my variables. That just feels like using unnecessary memory. Can anyone explain to me why the switch case does this and how I could solve my problem?

Original source