Như damryfbfnetsi chỉ ra trong các bình luận, JLS §14.11 có ghi chú sau:
Việc cấm sử dụng nulllàm nhãn chuyển đổi sẽ ngăn người ta viết mã không bao giờ được thực thi. Nếu switchbiểu thức là kiểu tham chiếu, nghĩa là Stringhoặc kiểu nguyên thủy được đóng hộp hoặc kiểu enum, thì lỗi thời gian chạy sẽ xảy ra nếu biểu thức ước lượng nullvào thời gian chạy. Theo đánh giá của các nhà thiết kế ngôn ngữ lập trình Java, đây là kết quả tốt hơn là âm thầm bỏ qua toàn bộ switchcâu lệnh hoặc chọn thực thi các câu lệnh (nếu có) sau defaultnhãn (nếu có).
(nhấn mạnh của tôi)
Trong khi câu cuối cùng bỏ qua khả năng sử dụng case null:, nó có vẻ hợp lý và đưa ra quan điểm về ý định của các nhà thiết kế ngôn ngữ.
Nếu chúng ta xem xét chi tiết triển khai, bài đăng trên blog này của Christian Hujer có một số suy đoán sâu sắc về lý do tại sao nullkhông được phép trong các công tắc (mặc dù nó tập trung vào công enumtắc thay vì công Stringtắc):
Trong phần mềm này, switchcâu lệnh thường sẽ biên dịch thành mã byte không cần thẻ. Và đối số "vật lý" switchcũng như các trường hợp của nó là ints. Giá trị int để bật được xác định bằng cách gọi phương thức Enum.ordinal(). Các lệnh [...] bắt đầu từ 0.
Điều đó có nghĩa, lập bản đồ nullđể 0sẽ không phải là một ý tưởng tốt. Một công tắc trên giá trị enum đầu tiên sẽ không thể phân biệt được với null. Có lẽ đó là một ý tưởng tốt để bắt đầu đếm số thứ tự cho enum ở mức 1. Tuy nhiên, nó không được định nghĩa như thế và định nghĩa này không thể thay đổi.
Trong khi các Stringcông tắc được triển khai khác nhau , thì enumcông tắc xuất hiện đầu tiên và đặt tiền lệ cho cách chuyển đổi trên loại tham chiếu nên hoạt động khi tham chiếu null.