Java'da int boş olabilir mi?


155

Bir Can intolmak nullJava?

Örneğin:

int data = check(Node root);

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

Amacım döndüren bir işlev yazmaktır int. Said int, bir düğümün yüksekliğinde saklanır ve düğüm yoksa, boş olur ve bunu kontrol etmem gerekecek.

Bunu ev ödevi için yapıyorum ama bu özel bölüm ev ödevinin bir parçası değil, sadece yaptığım işi yapmama yardımcı oluyor.

Yorumlar için teşekkürler, ama çok az kişi aslında kodun altında ne okudum gibi görünüyor, ben bu hedefe başka nasıl başarabilirim soruyordu; işe yaramadığını anlamak kolaydı.


1
Derleme zamanı hatasıdır.
MayurB

Yanıtlar:


201

int olamaz null adlı ama olmak Integer kutu . Boş Tamsayıları kutusundan çıkarırken dikkatli olmalısınız, çünkü bu çok fazla karışıklığa ve kafa çizilmesine neden olabilir!

örneğin bu:

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

NullPointerExceptionnesnenin boş olmamasına rağmen size bir verecek !

Sorunuzu takip etmek için , bir değerin olmadığını belirtmek isterseniz , araştırırımjava.util.Optional<Integer>


2
Tamsayı sınıfının var olmasının iyi nedenleri vardır, bu yüzden ihtiyaçlar zorlandığında kullanın.
Blessed Geek

6
@ h2g2java: Umarım bunları varsayılan koleksiyonla kullanabilmenin zorlayıcı olduğunu düşünmezsiniz çünkü HashMap <Integer, Integer> gibi şeyler için atık düzeyi çok büyüktür ve zorlayıcı değildir. Bu nedenle Trove'nin TIntIntHashMap, sadece ilkelleri kullanarak, zorlayıcı olmayan HashMap <Tamsayı, Tamsayı> etrafında döner.
SyntaxT3rr0r

1
int null için denetlenemez, ancak Java'da int'e Integer'a çevirerek güvenli bir şekilde null atayabilirsiniz, örneğin check (root) yöntemi null döndürürse, böyle bir şey yaparak int'e güvenle atabilirsiniz. bu: int data = (Integer)check(node);
sactiw

@sactiw - Ayrıntılı yapabilir misin? Ne aldığını anladığımdan emin değilim
Brian Agnew

7
@BrianAgnew Burada söylediklerimi düzeltmeme izin verin, basit bir hataydım, temelde NPE'yi kutudan int i = (Integer)null;çıkarırken çalışma zamanında atacağını fark etmedim .
sactiw

40

Hayır. İlkel değil, yalnızca nesne referansları boş olabilir.


3
OP null bir değer isterse daha uygun olan Integer sınıfından bahsetmeye değer. Veya "bulunamadı"
Glen

31

Öğrenmek için harika bir yol:

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

Derlemeye çalışın.


37
Aslında .. OP zaten sorusunun son cümlesine göre bunu fark
BalusC

9
Yaklaşık 4 yıl sonra gelecek nesiller için - bu parça daha sonra yapılan bir düzenlemeydi.
Matt Luongo

3
ama .. Integer ii = null; int i = ii;derlemek ama zamanında NullPointerException atmak
premek.v

13

Java'da int ilkel bir türdür ve nesne olarak kabul edilmez. Yalnızca nesnelerin boş değeri olabilir. Yani sorunuzun cevabı hayır, boş olamaz. Ama bu o kadar basit değil, çünkü en ilkel türleri temsil eden nesneler var.

Integer sınıfı bir int değerini temsil eder, ancak bir null değeri tutabilir. checkYönteminize bağlı olarak, bir int veya Tamsayı döndürüyor olabilirsiniz.

Bu davranış, ints gibi "ilkel" şeylerin bile nesne olarak kabul edildiği Ruby gibi tamamen nesneye yönelik dillerden farklıdır.


8

Yukarıdaki tüm cevap ile birlikte ben de bu noktayı eklemek istiyorum.

İlkel tipler için sabit bellek boyutuna sahibiz, yani int için 4 bayt ve char için 2 bayt var. Ve null yalnızca nesneler için kullanılır çünkü bellek boyutu sabit değildir.

Yani varsayılan olarak,

   int a=0;

ve yok

   int a=null;

Diğer ilkel türlerle aynıdır ve bu nedenle null, ilkel türler için değil, yalnızca nesneler için kullanılır.


5

Kod bile derlenmez. Sadece bir fullworthy Objectolabilir nullgibi Integer. Boş değeri ne zaman test edebileceğinizi gösteren temel bir örnek:

Integer data = check(Node root);

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

Öte yandan, check()is dönmek için ilan int, o olabilir asla olmak nullve bütün if-elseblok daha sonra gereksiz olduğunu.

int data = check(Node root);

// do something

Otomatik boks sorunları, check()geri döndüğü bildirildiğinde burada geçerli değildir int. Geri döndüyse Integer, yerine NullPointerExceptionbir atama riskiyle karşılaşabilirsiniz . Bunu a olarak atamak ve bloğu kullanmak gerçekten de zorunlu olurdu.intIntegerIntegerif-else

Otomatik boks hakkında daha fazla bilgi edinmek için bu Sun kılavuzuna bakın .


1
Ne yazık ki, "check" bir Tamsayı yerine bir int döndürürse, bu yardımcı olmaz, çünkü int (boş olmayacaktır) otomatik olarak Tamsayı içine kutulanacaktır.
Paul Tomblin

2
D'oh, null için ne zaman test yapabileceğinizi gösteren temel bir örnekti . Öte yandan, kontrolün geri döndüğü beyan edilirse int, asla boş olamaz ve eğer blok o zaman gereksiz olur.
BalusC

3

yerine ilan int ietmek yerine Integer io zaman yapabilirizi=null;

Integer i;
i=null;

2

Tam sayı nesnesi en iyisi olacaktır. Temel öğeleri kullanmanız gerekiyorsa, kullanım durumunuzda bulunmayan bir değer kullanabilirsiniz. Negatif yükseklik insanlar için mevcut değildir, bu yüzden

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

1

Hayır, ancak int [] olabilir.

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

@Glen'in bir yorumda belirttiği gibi, temel olarak bunun iki yolu vardır:

  • "sınır dışı" değeri kullanın. Örneğin, "veri" normal kullanımda asla negatif olamazsa, geçersiz olduğunu belirtmek için negatif bir değer döndürün.
  • Bir Tamsayı Kullan. "Check" yönteminin bir Tamsayı döndürdüğünden emin olun ve bunu bir int yerine Tamsayı atarsınız. Çünkü bir "int" bu sürece dahil olursa, otomatik boks ve kutudan çıkarma problemlere neden olabilir.

0

Check () yönteminizde null olup olmadığını kontrol edin ve null ise -1 veya sıfır gibi geçersiz bir değer döndürün. Sonra null değeri iletmek yerine bu değer için kontrol yapılır. Bu eski zamanlarda 'C' yapmak normal bir şey olurdu.


0

İnt, boolean veya float vb. Gibi herhangi bir İlkel veri türü null (lateral) depolayamaz, çünkü java, intle, int boolean'dan Boolean'a boolean gibi depolamak için Wrapper sınıfı sağlamıştır.

Örneğin: Tamsayı i = null;


0

Bir int null değil, başlatılmazsa 0 olabilir. Bir tamsayının boş olabilmesini istiyorsanız, int yerine Tamsayı kullanmanız gerekir. ilkellerin değeri sıfır değildir. int için varsayılan değer 0'dır.

Veri Türü / Varsayılan Değer (alanlar için)

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

uzun ---------------- 0L

şamandıra ---------------- 0.0f

çift ​​------------- 0.0d

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

Dize --------------- null

boole ------------ yanlış


-2

Hedefinize ulaşmanın başka bir yolunu istediğiniz için, bir sarmalayıcı sınıfı kullanmanızı öneririz:

new Integer(null);

-17

Ben uzman değilim, ama nullint için eşdeğer olduğuna inanıyorum 0.

Örneğin , bir anahtar yaparsanız, başka bir şeye ayarlamadığınız sürece int[]her yuva 0aksine kullanılır null.

Bazı durumlarda, bu yararlı olabilir.


Çok basit olarak, 0 null ile aynı değildir.
Dave Goodchild
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.