路地裏牧場

技術系ブログだったけどごった煮になった謎ブログ

Java switchの各caseのスコープ

条件分岐に使うswitch文。
Java7で文字列にも対応してより一層使い所が増えました。

が、こんな落とし穴が。

間違った例

switch (value) {
    case "yes":
        int val = 0;
        resultModel.setValue(val);
        logger.info("val" + val);
        break;
    case "no":
        int val = 1;
        resultModel.setValue(val);
        logger.info("val" + val);
        break;
    case "cancel":
        logger.info("cancelled");
        break;
    default:
        logger.info("invalid value" + value);
        break;
}

実はこれ、エラーが出ます。

case "yes":
    int val = 0; // これ

case "no":
    int val = 1; // これ

が競合してる、というのです。
ぱっと見では違うスコープなので競合は起こらないように見えます。
しかも競合してるくせしてno側ではyes側のvalは使えないのです。なんじゃそりゃ。

解決策

switch (value) {
    case "yes": {
        int val = 0;
        resultModel.setValue(val);
        logger.info("val" + val);
        break;
    }
    case "no": {
        int val = 1;
        resultModel.setValue(val);
        logger.info("val" + val);
        break;
    }
    case "cancel": {
        logger.info("cancelled");
        break;
    }
    default: {
        logger.info("invalid value" + value);
        break;
    }
}

( ^ω^)こうじゃ

これで別のスコープと判断され、競合は起こらなくなります。
非常に面倒です。
スコープは波括弧内、というのは基本中の基本なのですが忘れがちです。気をつけましょう。

やめてそんなこともわからないのかハゲって言いながら石を投げないで

参考:java - Variable's scope in a switch case - Stack Overflow