Null Returns dalam Ternary Operators vs. If Statements
Pertimbangkan coretan kod Java berikut:
<code class="java">public class Main { private int temp() { return true ? null : 0; } private int same() { if (true) { return null; } else { return 0; } } public static void main(String[] args) { Main m = new Main(); System.out.println(m.temp()); System.out.println(m.same()); } }</code>
Dalam kaedah temp(), pengendali ternary true ? null : 0 menyemak jika benar adalah benar dan mengembalikan null, jika tidak ia mengembalikan 0. Walaupun jenis pulangan kaedah adalah int, pengkompil membenarkan null dikembalikan. Walau bagaimanapun, apabila menjalankan kod, NullPointerException dilemparkan.
Dalam kaedah yang sama(), pernyataan if cuba untuk mengembalikan null jika benar adalah benar, tetapi pengkompil melaporkan ralat masa kompilasi disebabkan oleh pulangan yang tidak serasi jenis.
Mengapa Perbezaan?
Perbezaan utama ialah bagaimana pengkompil mentafsir null dalam pengendali ternary dan pernyataan if. Dalam pengendali ternary, null dianggap sebagai rujukan null kepada objek Integer. Di bawah peraturan autoboxing dan unboxing (Spesifikasi Bahasa Java, 15.25), null ditukar secara automatik kepada int dengan menyahkotak, menghasilkan NullPointerException apabila int digunakan.
Sebaliknya, pernyataan if secara eksplisit menyemak kebenaran ungkapan benar dan cuba untuk mengembalikan null, yang tidak serasi dengan jenis pulangan yang diisytiharkan int. Oleh itu, pengkompil menjana ralat masa kompilasi untuk mengelakkan pelaksanaan kod yang salah.
Atas ialah kandungan terperinci Mengapa Pulangan Null Menyebabkan NullPointerException dalam Operator Ternary tetapi Ralat Masa Kompilasi dalam Pernyataan If?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!