Запомните, что выражение внутри switch в Java не может принимать значение null. Если выражение в switch будет вычислено в null, то возникнет NullPointerException. Поэтому вам нужно вставлять проверки на null до switch, если это выражение может стать null.
Вот так не надо:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class Main { public static void main(String[] args) throws InterruptedException { Integer x = null; switch (x) { // NullPointerException case 0: System.out.println("case 0"); break; case 100: System.out.println("one hundred"); break; default: System.out.println("default"); break; } } } |
Правильно вот так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public class Main { public static void main(String[] args) throws InterruptedException { Integer x = null; if (x == null) { System.out.println("x == null!"); } else { switch (x) { // NullPointerException case 0: System.out.println("case 0"); break; case 100: System.out.println("one hundred"); break; default: System.out.println("default"); break; } } } } |
Подробнее о работе switch можно узнать в этой статье.
Какой ужас!
Предлагаю поменять язык Java, чтобы там можно было проверять на null в switch.
Java 9 уже на подходе?
На самом деле тут не всё так просто. Оператор switch первоначально создавался для примитивных типов: byte, short, char, int, а затем для перечислений. Затем в Java 7 туда стало можно пихать String. Типы byte, short, char и int не могут быть null. В данном примере, который в статье, я использую Integer. В switch происходит автораспаковка в int, в процессе которой и происходит NullPointerException.
Но даже если бы там был enum или String, то всё равно возник бы NullPointerException. Думаю, что так сделали из-за того, что перечисления в Java добавились позже, а String в операторе switch ещё позже. И когда их добавляли, switch уже не мог принимать null-ы. Но это только мои догадки, конечно.