Üçlü if olursa otomatik kutudan çıkarma ihtiyacı


23

Bu kod parçası iyi çalışıyor: -

    Integer nullInt = null;
    if (1 <= 3) {
        Integer secondNull = nullInt;
    } else {
        Integer secondNull = -1;
    }
    System.out.println("done");

Ancak bu, boş gösterici istisnası atar, Eclipse ise otomatik kutu açma gereksinimi olduğunu belirtir: -

    Integer nullInt = null;
    Integer secondNull = 1 <= 3 ? nullInt : -1;
    System.out.println("done");

Neden böyle, biri lütfen rehberlik edebilir mi?

Yanıtlar:


22

Üçlü koşullu ifadenin türü

1 <= 3 ? nullInt : -1

olduğu int(JLS 2. ve 3. işlenen türlerine bağlı olarak üçlü koşullu operatör tipini açıklayan birkaç tablo içerir).

Bu nedenle, nullIntbir kutuya kutudan çıkarmaya çalıştığında inta NullPointerExceptionatılır.

İf-else snippet'inizin davranışını elde etmek için şunları yazmanız gerekir:

1 <= 3 ? nullInt : Integer.valueOf(-1)

Şimdi ifadenin türü olacak Integer, böylece kutudan çıkma gerçekleşmeyecek.


4
Sadece cevabınıza eklemek için, aşağıda belirtilen tablolar verilmiştir: docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.25
Withinalen

3

Üçlü operatöre yönelik argümanların aynı türden olması gerektiğinden eminim. -1 ve bazı sabit nullintderleyici kullandığınızdan beri nullintdeğer almak için kutuyu açmaya çalışır . Ve sonra secondNulldeğişkeni saklamak için otomatik kutu .


3

Bunun nedeni, koşullu işleç için iki işlenenin ? :ilkel bir tür ve kutulu başvuru türünde olması durumunda, bir kutu açma dönüştürmesi yapılır ( JLS §15.25.2 ):

Sayısal koşullu ifadenin türü aşağıdaki gibi belirlenir:

  • ...
  • İkinci ve üçüncü işlenenlerden biri ilkel tip T ise ve diğeri ise T'ye boks dönüşümü (§5.1.7) uygulanmasının sonucuysa, koşullu ifadenin türü T'dir.

Genel olarak, bir ififadeyi bir ? :ifadeyle değiştirmek her zaman kodun anlamını korumaz, çünkü ? :ifadenin derleme zamanı türüne sahip olması gerekir. Bu, iki işlenenin türü farklı olduğunda, sonucun tutarlı bir derleme zamanı türüne sahip olması için birine veya her ikisine de dönüşüm yapılması gerekir.


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.