SORU
15 AĞUSTOS 2013, PERŞEMBE


Neden't Dize deyimi destek boş bir durumda anahtarı değil mi?

Sadece 7 switch açıklama null dava desteklemiyor neden merak ediyorum ve yerine NullPointerException atar? Bakın aşağıda çizgi yorumladı (örnek the Java Tutorials article on switch alınan):

{
    String month = null;
    switch (month) {
        case "january":
            monthNumber = 1;
            break;
        case "february":
            monthNumber = 2;
            break;
        case "march":
            monthNumber = 3;
            break;
        //case null:
        default: 
            monthNumber = 0;
            break;
    }

    return monthNumber;
}

Bu switch her kullanımdan önce null kontrolü için if bir koşul Kaçınılması olurdu.

CEVAP
15 AĞUSTOS 2013, PERŞEMBE


Damryfbfnetsi yorum points out, JLS §14.11 aşağıdaki not var

Anahtar, bir etiket olarak null kullanarak karşı yasak asla çalıştırılabilir kod yazma birer engel. Eğer switch ifadesidir bir başvuru türü, String veya kutulu ilkel türü ya da bir numaralandırma türü, o zaman bir çalışma zamanı hatası oluşur deyimi değerlendirir için null zamanında.Bu kıyamet tasarımcılarının Java programlama dili, bu daha iyi bir sonuç daha sessizce atlama tüm switch bildirim ya da seçmek için idam ifadeleri (varsa) sonra default etiketi (varsa).

(vurgu benim)

Son cümle ise kullanma imkanı atlar case null: makul görünüyor ve diline bir görünüm sağlar tasarımcıların niyeti.

Eğer biz yerine bak Uygulama Detayları, this blog post Hıristiyan Hujer var biraz anlayışlı spekülasyon hakkında neden null değil izin anahtarları (gerçi merkezleri enum anahtarları yerine Strings):

Kaputun altında, switch deyimi genellikle tablesswitch bayt koduna derlenir. Ve "fiziksel" değişken switch iyi durumda intler. Açmak için int değeri 21* *yöntemini çağırarak belirlenir. [...] Sıra sayıları sıfırdan başlar.

Bu, 0 22 *eşleme iyi bir fikir değil demektir. İlk numaralandırma değeri bir anahtar boş, indistinguishible olurdu. Belki numaralamalar için sıra sayılarını sayma 1 de başlamak için iyi bir fikir olurdu. Ancak böyle tanımlanmış alamadım, ve bu tanım değiştirilebilir.

String are implemented differently, anahtarları enum anahtarı ilk geldi ve bir başvuru türüne geçiş başvurusu null ne zaman nasıl davranması gerektiği için bir emsal teşkil etmeli.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • André Frizzo

    André Frizz

    16 Aralık 2006
  • Kamikazeepanda

    Kamikazeepan

    5 ŞUBAT 2006
  • Ryan Billy

    Ryan Billy

    30 EKİM 2006