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 null
là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 switch
biểu thức là kiểu tham chiếu, nghĩa là String
hoặ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 null
và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ộ switch
câu lệnh hoặc chọn thực thi các câu lệnh (nếu có) sau default
nhã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 null
không được phép trong các công tắc (mặc dù nó tập trung vào công enum
tắc thay vì công String
tắc):
Trong phần mềm này, switch
câ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ý" switch
cũng như các trường hợp của nó là int
s. 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
để 0
sẽ 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 String
công tắc được triển khai khác nhau , thì enum
cô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
.