Bisakah int menjadi null di Java?


155

Bisakah suatu intberada nulldi Jawa?

Sebagai contoh:

int data = check(Node root);

if ( data == null ) {
 // do something
} else {
 // do something
}

Tujuan saya adalah menulis fungsi yang mengembalikan sebuah int. Said intdisimpan di ketinggian sebuah simpul, dan jika simpul itu tidak ada, itu akan menjadi nol, dan aku harus memeriksanya.

Saya melakukan ini untuk pekerjaan rumah tetapi bagian khusus ini bukan bagian dari pekerjaan rumah, itu hanya membantu saya melewati apa yang saya lakukan.

Terima kasih atas komentarnya, tetapi tampaknya sangat sedikit orang yang benar-benar membaca apa yang ada di bawah kode, saya bertanya bagaimana lagi saya dapat mencapai tujuan ini; mudah untuk mengetahui bahwa itu tidak berhasil.


1
Ini adalah kesalahan waktu kompilasi.
MayurB

Jawaban:


201

int tidak boleh nol, tetapi Integer bisa . Anda harus berhati-hati ketika menghapus bilangan bulat nol karena ini dapat menyebabkan banyak kebingungan dan goresan kepala!

misalnya ini:

int a = object.getA(); // getA returns a null Integer

akan memberi Anda NullPointerException, meskipun objek tidak menjadi nol!

Untuk menindaklanjuti pertanyaan Anda, jika Anda ingin menunjukkan tidak adanya nilai, saya akan menyelidikijava.util.Optional<Integer>


2
Ada alasan bagus untuk keberadaan kelas Integer, jadi gunakan ketika kebutuhan mendesak.
Blessed Geek

6
@ h2g2java: Saya harap Anda tidak berpikir bahwa bisa menggunakannya dengan koleksi default sangat menarik karena untuk hal-hal seperti HashMap <Integer, Integer> tingkat limbah sangat besar dan tidak menarik. Itulah sebabnya Trove's TIntIntHashMap, hanya menggunakan primitif, berjalan mengelilingi lingkaran HashMap <Integer, Integer> yang tidak menarik.
SyntaxT3rr0r

1
int tidak dapat diperiksa untuk null, namun, Anda dapat dengan aman menetapkan null ke int di Java dengan mengirimkannya ke Integer, misalnya jika metode pemeriksaan (root) dapat mengembalikan null maka Anda dapat dengan aman melemparkannya ke int dengan melakukan sesuatu seperti ini: int data = (Integer)check(node);
sactiw

@sactiw - Bisakah Anda menguraikan? Saya tidak yakin saya mengerti apa yang Anda maksud
Brian Agnew

7
@BrianAgnew Biarkan saya memperbaiki apa yang saya katakan di sini, saya benar-benar salah, pada dasarnya saya tidak menyadari bahwa int i = (Integer)null;akan melempar NPE pada saat run-time ketika membuka kotak.
sactiw

40

Tidak. Hanya referensi objek yang bisa nol, bukan primitif.


3
Layak disebutkan kelas Integer yang akan lebih cocok jika OP menginginkan nilai nol. Atau dia bisa menggunakan nilai negatif untuk menunjukkan "tidak ditemukan"
Glen

31

Cara yang bagus untuk mengetahuinya:

public static void main(String args[]) {
    int i = null;
}

Coba kompilasi.


37
Sebenarnya .. OP sudah menemukan itu sendiri sesuai dengan frase terakhir dalam pertanyaannya: mudah untuk mengetahui bahwa itu tidak berhasil.
BalusC

9
Untuk anak cucu hampir 4 tahun kemudian- bit itu sudah diedit kemudian.
Matt Luongo

3
tapi .. Integer ii = null; int i = ii;akan mengkompilasi tetapi melempar NullPointerException saat runtime
premek.v

13

Di Jawa, int adalah tipe primitif dan tidak dianggap sebagai objek. Hanya objek yang dapat memiliki nilai nol. Jadi jawaban untuk pertanyaan Anda adalah tidak, tidak boleh nol. Tapi itu tidak sesederhana itu, karena ada objek yang mewakili tipe paling primitif.

Integer kelas mewakili nilai int, tetapi dapat menyimpan nilai nol. Tergantung pada Andacheck metode Anda, Anda bisa mengembalikan int atau Integer.

Perilaku ini berbeda dari beberapa bahasa berorientasi objek yang lebih murni seperti Ruby, di mana bahkan hal-hal "primitif" seperti int dianggap objek.


8

Bersama dengan semua jawaban di atas saya ingin menambahkan poin ini juga.

Untuk tipe primitif, kami telah memperbaiki ukuran memori yaitu untuk int kami memiliki 4 byte dan karakter kami memiliki 2 byte. Dan null hanya digunakan untuk objek karena ukuran memori tidak diperbaiki.

Jadi secara default kita memiliki,

   int a=0;

dan tidak

   int a=null;

Sama dengan tipe primitif lainnya dan karenanya null hanya digunakan untuk objek dan bukan untuk tipe primitif.


5

Kode bahkan tidak akan dikompilasi. Hanya yang layak Objectbisa null, seperti Integer. Berikut ini adalah contoh dasar untuk ditampilkan saat Anda dapat menguji nol:

Integer data = check(Node root);

if ( data == null ) {
 // do something
} else {
 // do something
}

Di sisi lain, jika check()dinyatakan untuk kembali int, itu tidak akan pernah bisa nulldan seluruh if-elseblok kemudian berlebihan.

int data = check(Node root);

// do something

Masalah autoboxing tidak berlaku di sini juga ketika check()dinyatakan untuk kembali int. Jika sudah kembali Integer, maka Anda dapat mengambil risiko NullPointerExceptionsaat menugaskannya sebagai intganti Integer. Menetapkannya sebagai Integerdan menggunakan if-elseblok itu memang wajib.

Untuk mempelajari lebih lanjut tentang autoboxing, periksa panduan Sun ini .


1
Sayangnya jika "centang" mengembalikan int daripada Integer, ini tidak akan membantu, karena int (yang tidak akan nol) akan secara otomatis dimasukkan ke dalam Integer.
Paul Tomblin

2
Ya, itu hanya contoh dasar untuk menunjukkan kapan Anda dapat menguji nol. Di sisi lain, jika cek dinyatakan kembali int, itu tidak akan pernah menjadi nol dan keseluruhan jika blok kemudian berlebihan.
BalusC

3

alih-alih mendeklarasikan sebagai int imenyatakan itu Integer imaka kita bisa lakukani=null;

Integer i;
i=null;

2

Objek integer akan menjadi yang terbaik. Jika Anda harus menggunakan primitif, Anda dapat menggunakan nilai yang tidak ada dalam use case Anda. Tinggi negatif tidak ada untuk orang, jadi

public int getHeight(String name){
    if(map.containsKey(name)){
        return map.get(name);
    }else{
        return -1;
    }
}

1

Tidak, tetapi int [] bisa.

int[] hayhay = null; //: allowed (int[] is reference type)
int   hayno  = null; //: error   (int   is primitive type)
                     //: Message: incompatible types: 
                     //: <null> cannot be converted to int

0

Seperti yang disebutkan @Glen dalam komentar, Anda pada dasarnya memiliki dua cara untuk mengatasi ini:

  • gunakan nilai "out of bound". Misalnya, jika "data" tidak pernah bisa negatif dalam penggunaan normal, kembalikan nilai negatif untuk menunjukkan itu tidak valid.
  • Gunakan Integer. Pastikan saja metode "check" mengembalikan Integer, dan Anda menetapkannya ke Integer bukan int. Karena jika "int" terlibat di sepanjang jalan, tinju otomatis dan unboxing dapat menyebabkan masalah.

0

Periksa null dalam metode check () Anda dan kembalikan nilai yang tidak valid seperti -1 atau nol jika nol. Maka cek akan untuk nilai itu daripada melewati nol bersama. Ini akan menjadi hal yang normal untuk dilakukan di masa lalu 'C'.


0

Setiap tipe data Primitive seperti int, boolean, atau float dll tidak dapat menyimpan null (lateral), karena java telah menyediakan kelas Wrapper untuk menyimpan yang sama seperti int ke Integer, boolean ke Boolean.

Misalnya: Integer i = null;


0

Int bukan nol, mungkin 0 jika tidak diinisialisasi. Jika Anda ingin integer menjadi nol, Anda perlu menggunakan Integer daripada int. primitif tidak memiliki nilai nol. miliki untuk int adalah 0.

Tipe Data / Nilai Default (untuk bidang)

int ------------------ 0

panjang ---------------- 0L

mengapung ---------------- 0.0f

gandakan ------------- 0.0d

char --------------- '\ u0000'

String --------------- null

boolean ------------ salah


-2

Karena Anda meminta cara lain untuk mencapai tujuan Anda, saya sarankan Anda menggunakan kelas pembungkus:

new Integer(null);

-17

Saya bukan ahli, tapi saya percaya bahwa yang nullsetara untuk int adalah0 .

Misalnya, jika Anda membuat int[], setiap slot berisi yang 0bertentangannull , kecuali jika Anda mengaturnya untuk yang lain.

Dalam beberapa situasi, ini mungkin berguna.


Sederhananya, 0 tidak sama dengan nol.
Dave Goodchild
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.