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

  • cyriak

    cyriak

    29 Mart 2006
  • David Wills

    David Wills

    31 Aralık 2007
  • iZAPPA

    iZAPPA

    16 Temmuz 2010