İstisnalar atılırken neden boş referanslar kapatılıyor?


21

Bazı programlama dili arkadaşlarının boş referansların tutarlı bir şekilde oluşturulmasını pek anlamadım. Onlarla ilgili bu kadar kötü olan ne? Var olmayan bir dosyaya okuma erişimi talebinde bulunursam, bir istisna veya boş referans almaktan tamamen memnunum, ancak istisnalar iyi kabul edilir ancak boş referanslar kötü olarak kabul edilir. Bunun arkasındaki sebep nedir?



2
Bazı diller boşuna diğerlerinden daha iyi çöküyor. Net / Java gibi bir "yönetilen kod" için null ref yalnızca başka bir problem türüdür, oysa diğer yerel kodlar bunu zarif bir şekilde ele alamayabilir (belirli bir dilden bahsetmediniz). Yönetilen bir dünyada bile, bazen güvenli güvenlik kodu (gömülü ?, silahlar?) Yazmak istersiniz ve bazen en kısa sürede ASAP (birim testi) yüksek sesle kaltak istiyorsunuz. Her iki kod türü de aynı kütüphaneye çağrılabilir - bu bir problem olurdu. Genel olarak, bilgisayarların duygularını incitmemeye çalışan kodun kötü bir fikir olduğunu düşünüyorum. Hata güvenliği yine de HARD'dir.
İş

@Job: Bu tembellik savunuyor. Bir istisna ile nasıl başa çıkılacağını biliyorsanız, onunla başa çıkın. Bazen bu kullanım başka bir istisna atmayı da içerebilir, ancak hiçbir zaman boş bir referans istisnanın işlenmemesine izin vermemelisiniz . Hiç. Her bakım programcısının kabusu budur; tüm ağacın en yararsız istisnasıdır. Sadece Stack Overflow'a sor .
Aaron

ya da başka bir şekilde söylemek gerekirse - neden hata bilgilerini göstermek için bir tür kod döndürmüyorsunuz? Bu argüman yıllarca öfkelenecek.
gbjbaanb

Yanıtlar:


24

Boş referanslar, en azından şimdiye kadar tanıdığım veya okuduğum herhangi bir kişi tarafından istisnalardan daha fazla "küçültülmüyor". Sanırım geleneksel bilgeliği yanlış anlıyorsun.

Ne kötü yönelik bir girişimdir erişmek Boş bir başvuru (veya boş gösterici, vb inceleyebilirsiniz). Bu kötü, çünkü her zaman bir hatayı gösterir; eğer bunu bilerek böyle bir şey yapmak ve asla edilir bilerek yaptığını o imkansız arabası davranıştan beklenen davranış ayırt etmek yapıyor çünkü, o zaman, bu en daha da kötüsü.

Bir nedenden dolayı sıfırlık kavramından gerçekten nefret eden bazı saçak grupları var, ama Ed'in işaret ettiği gibi , eğer yoksa nullya da nilsonra başka bir şeyle değiştirmek zorunda kalacaksın. bir çökmeden daha kötü (örneğin veri bozulması).

Aslında birçok çerçeve her iki kavramı da benimser; örneğin, .NET'te, göreceğiniz sık rastlanan bir örnek, bir tanesi Try(örneğin gibi TryGetValue) öneki olan bir çift yöntemdir . Bu Trydurumda, referans varsayılan değerine (genellikle null) ayarlanır ve diğer durumda bir istisna atılır. Her iki yaklaşımda da yanlış bir şey yok; her ikisi de kendilerini destekleyen ortamlarda sıkça kullanılır.

Her şey anlambilime bağlı. Eğer nullbir koleksiyon arama genel durumunda olduğu gibi geçerli bir dönüş değeri vardır, o zaman dönün null. Öte yandan, geçerli bir geri dönüş değeri değilse - örneğin, kendi veritabanınızdan gelen birincil anahtarı kullanarak bir kayıt aramak - o zaman geri dönmek nullkötü bir fikir olacaktır, çünkü arayan kişi onu beklemeyecektir ve muhtemelen kontrol etmeyecek.

Hangi anlamsalın kullanılacağını anlamak gerçekten çok basit: Bir fonksiyonun tanımlanamamasının bir anlamı var mı? Öyleyse, boş bir başvuru verebilirsiniz. Değilse, bir istisna atın.


5
Aslında boş ya da sıfır olmayan ve "başka bir şeyle değiştirmek zorunda" olmayan diller var. NULL olabilecek referanslar orada bir şey olabileceği veya olamayabileceği anlamına gelir. Kullanıcının orada bir şey olup olmadığını açıkça kontrol etmesini istiyorsanız, sorunu çözdünüz. Gerçek bir yaşam örneği için haskell'e bakın.
Johanna Larsson

3
@ErikKronberg, evet, "milyar dolarlık hata" ve hepsi bu saçmalık, bunu pataklayan ve yeni ve büyüleyici olduğunu iddia eden insanların geçit töreni asla bitmeyecek, bu yüzden önceki yorum dizisi silindi. İnsanların asla gündeme getiremedikleri bu devrimci değişimler, her zaman Null Object, Option veya Contract'ın bir türevidir; temel mantık hatasını aslında sihirli bir şekilde ortadan kaldırmaz, sırasıyla onu erteler veya tanıtırlar. Neyse, bu programlama dilleri ile ilgili bir soru besbelli yapmak zorunda nullbu yüzden gerçekten, Haskell burada oldukça önemsizdir.
Aaron,

1
ciddiyetle null için bir sınama gerektirmemesinin bunu istemek kadar iyi olduğunu mu düşünüyorsun?
Johanna Larsson

3
@ErikKronberg: Evet, "ciddiyim", null için test etme zorunluluğunun özellikle (a) Null Nesnesinin davranışı çevresinde bir uygulamanın her aşamasını tasarlamak zorunda kalmasından, (b) desen eşleştirmesi yapmaktan özellikle farklı olmadığını iddia ediyorum. Her zaman seçenekler, veya (c) arayanın “bilmiyorum” demesine izin vermemek ve bir istisna veya çökmeye zorlamak. Orada bir var sebebi neden nullbu kadar uzun süre çok iyi dayandı ve aksini söylüyor insanların çoğunluğu eksik gereksinimleri veya nihai tutarlılık gibi kısıtlamalarla küçük deneyim tasarımı gerçek dünyadaki uygulamalarıyla akademisyenler gibi görünüyor.
Aaron,

3
@Aaronaught: Bazen yorumlarınız için aşağıya bir düğme olmasını diliyorum. Böyle bağırmak için bir sebep yok.
Michael Shaw

11

Büyük fark şu ki, NULL'ları işlemek için kod bırakırsanız, kodunuzun muhtemelen sonraki bir aşamada ilgisiz bazı hata mesajlarıyla kilitlenmeye devam etmesi, istisnalarda olduğu gibi istisnanın başlangıç ​​noktasında ortaya çıkması (açılış) Örnekte okumak için bir dosya).


4
NULL değerinin işlenmemesi, kodunuzla geri döndürdüğünüz arabirim arasındaki bilgisizliği dikkate almaz. Bu hatayı yapan geliştiriciler başkalarını NULL yapmayan bir dilde yapar.
Blrfl

@Blrfl, ideal olarak yöntemler oldukça kısadır ve bu nedenle sorunun tam olarak nerede olduğunu anlamak kolaydır. İyi bir hata ayıklayıcı, kod uzun olsa bile, genellikle boş bir başvuru istisnasını yakalayabilir. Orada olmayan bir kayıt defterinden kritik bir ayarı okumaya çalışıyorsam ne yapmam gerekir? Kayıt defterim dağıldı ve bir düğümü sessizce yeniden oluşturmak ve varsayılana ayarlamaktan çok, kullanıcının başarısız olmasına ve sinirlenmesine daha iyi oluyorum. Ya bunu bir virüs yaptıysa? Öyleyse, eğer sıfır alırsam, uzmanlık dışı bir istisna atmalı mıyım yoksa sadece yarılsın mı? Kısa yöntemlerle büyük fark nedir?
İş

@Job: Ya bir hata ayıklayıcınız yoksa? Başvurunuzun% 99,99'unun serbest bırakma ortamında çalışacağının farkında mısınız? Bu olduğu zaman, daha anlamlı bir istisna kullanmış olmayı dileyeceksiniz. Uygulamanız yine de kullanıcının başarısız olmasına ve rahatsız etmesine neden olabilir, ancak en azından sorunu derhal izlemenizi sağlayacak hata ayıklama bilgilerini çıkartacaktır , böylece söz konusu rahatsızlığı minimumda tutar.
Aaron

@Birfl, bazen bir sıfırın geri dönmenin doğal olacağı bir olayı ele almak istemiyorum. Örneğin, değerler için bir konteyner eşleme anahtarım olduğunu varsayalım. Eğer mantığım, ilk kaydetmediğim değerleri okumaya çalışmadığımı garanti ederse, o zaman asla geri dönmemeliyim. Bu durumda, neyin yanlış gittiğini belirtmek için mümkün olduğunca fazla bilgi sağlayan bir istisnaya sahip olmayı tercih ederim, daha sonra programda başka bir yerde gizemli bir şekilde başarısızlığa uğramak için boş bir değer döndürmek.
Winston Ewert

Bunu başka türlü ifade etmek gerekirse, istisnai durumlar dışında, olağandışı olayı açıkça ele almam gerekir, aksi halde programım hemen ölür. Boş referanslarda, kod olağandışı durumla açıkça başa çıkmazsa, kısıtlamaya çalışacaktır. Ben şimdi başarısız olayı almak daha iyi olduğunu düşünüyorum.
Winston Ewert

8

Çünkü boş değerler bir programlama dilinin gerekli bir parçası değildir ve tutarlı bir hata kaynağıdır. Söylediğiniz gibi, bir dosyayı açmak başarısızlıkla sonuçlanabilir, bu da boş bir geri dönüş değeri olarak veya istisna yoluyla geri iletilebilir. Eğer boş değerlere izin verilmediyse, başarısızlığı bildirmek için tutarlı ve tekil bir yol vardır.

Ayrıca, bu boş değerlerle ilgili en yaygın sorun değildir. Çoğu kişi onu döndüren bir işlevi çağırdıktan sonra null değerini kontrol etmeyi hatırlar. Sorun, programınızın yürütülmesinde çeşitli noktalarda değişkenlerin boş olmasına izin vererek kendi tasarımınızda çok daha fazla ortaya çıkar. Kodunuzu, boş değerlere asla izin verilmeyecek şekilde tasarlayabilirsiniz, ancak dil düzeyinde boş olmasına izin verilmezse bunların hiçbiri gerekli olmaz.

Bununla birlikte, pratikte bir değişkenin başlatılıp başlatılmadığını belirtmek için yine de bir yönteme ihtiyacınız olacaktır. Daha sonra, programınızın çökmediği, bunun yerine bazı geçersiz varsayılan değerleri kullanmaya devam ettiğiniz bir böcek biçiminiz olur. Açıkçası hangisinin daha iyi olduğunu bilmiyorum. Param için erken ve sık sık kaza yapmayı seviyorum.


Tanımlayıcı bir dizgeye sahip olan Başlatılmamış bir alt sınıfı göz önünde bulundurun ve tüm yöntemleri istisnalar atar. Bunlardan biri ortaya çıkarsa, ne olduğunu biliyorsun. Sınırlı belleğe sahip gömülü sistemlerde, Başlatılmamış fabrikanın üretim sürümü boşa dönebilir.
Jim Balter

3
@ Jim Balter: Sanırım pratikte gerçekte nasıl yardımcı olacağı konusunda kafam karıştı. Önemsiz olmayan herhangi bir programda, bir noktada başlatılamayan değerlerle uğraşmanız gerekecektir. Bu nedenle, varsayılan bir değeri belirtmenin bir yolu olmalı. Bu nedenle, devam etmeden önce hala bunu kontrol etmeniz gerekir. Dolayısıyla, potansiyel bir çöküş yerine, şimdi potansiyel olarak geçersiz verilerle çalışıyorsunuz.
Ed S.

1
Ayrıca nullbir iade değeri olarak elde ettiğinizde ne olduğunu da biliyorsunuz : İstediğiniz bilgiler mevcut değil. Fark yok. Her iki durumda da, arayan kişi bu bilgiyi belirli bir amaç için kullanması gerekiyorsa dönüş değerini doğrulamak zorundadır. Bir doğrulamayı null, boş bir nesneyi mi yoksa bir monad'ı doğrulamak mı pratik bir fark yaratmaz.
Aaron

1
@ Jim Balter: Doğru, hala pratik farkı göremiyorum ve akademi dışında gerçek programlar yazan insanlar için hayatı nasıl kolaylaştırdığını görmüyorum. Faydaların olmadığı anlamına gelmez, sadece bana açık görünmüyorlar.
Ed S.

1
Başlatılmamış bir sınıfla pratik farkı iki kez açıkladım - boş öğenin kökenini tanımlar - boş değerin dereferansı oluştuğunda hatayı belirlemeyi mümkün kılar. Boş olmayan paradigmalar etrafında tasarlanan dillere gelince, problemin başından sonuna kadar kaçınıyorlar - programlanmayacak alternatif yollar sunuyorlar. onlara aşina değilseniz, bunu kavramak zor görünebilir. Aynı zamanda büyük bir hata sınıfından da kaçınan yapısal programlama, bir zamanlar “akademik” olarak kabul edildi.
Jim Balter

5

Öncelikle boş bir referans fikri yaratan Tony Hoare, buna bir milyon dolarlık hata diyor .

Sorun, kendi başına boş referanslar ile ilgili değil, çoğu (aksi halde) güvenli dillerde uygun tür denetiminin olmaması hakkındadır.

Bu destek eksikliği, dilden, "boş-böcek" programında, tespit edilmeden önce uzun süre programda gizleniyor olabilir. Elbette, böceklerin doğası böyledir, ancak “boş-böcek” lerin artık önlenebileceği bilinmektedir.

Bu sorun özellikle C veya C ++ 'da (örneğin) neden olduğu "zor" hata nedeniyle (programın çökmesi, hemen, zarif bir iyileşme olmadan) meydana gelir.

Diğer dillerde, her zaman onları nasıl ele alacağınız sorusu vardır.

Java veya C # ile boş bir başvuruda bir yöntem çağırmaya çalışırsanız bir istisna elde edersiniz ve sorun olmaz. Ve bu nedenle Java veya C # programcılarının çoğu buna alışkın ve neden başka türlü yapmak istediğini anlamıyor (ve C ++ 'a gülmek).

Haskell'de, null durum için açıkça bir eylemde bulunmanız gerekiyor ve bu nedenle Haskell programcıları iş arkadaşlarına bağırıyorlar, çünkü haklılar (doğru mu?).

Gerçekten, eski hata kodu / istisna tartışması, ancak bu sefer hata kodu yerine Sentinel Değerine sahip.

Her zaman olduğu gibi hangisi en uygunsa, duruma ve aradığınız anlambilime bağlıdır.


Tam. nullgerçekten kötüdür, çünkü tip sistemini altüst eder . (Verildiği gibi, alternatifin en azından bazı dillerde ayrıntılarıyla bir sakıncası vardır.)
Mekanik salyangoz

2

Boş bir işaretçiye insan tarafından okunabilen bir hata mesajı ekleyemezsiniz.

(Bununla birlikte, bir günlük dosyasında bir hata mesajı bırakabilirsiniz.)

İşaretçi aritmetiğine izin veren bazı dillerde / ortamlarda, işaretçi argümanlarından biri boşsa ve hesaplamaya izin verilirse, sonuç geçersiz , boş olmayan bir işaretçi olur. (*) Size daha fazla güç.

(*) Bu, COM programlamada çok olur , burada bir arabirim yöntemini çağırmaya çalışırsanız, ancak arabirim işaretçisi boşsa, neredeyse sıfırdan farklı, neredeyse tamamen değil, geçersiz bir adrese yapılan bir çağrıyla sonuçlanır.


2

Bir hatayı bildirmek için NULL (veya sayısal sıfır veya boolean false) döndürmek hem teknik hem de kavramsal olarak yanlıştır.

Teknik olarak, programlayıcıya, iade değerini derhal ve iade edildiği noktayı kontrol ederek yüklüyorsunuz . Bir satırda yirmi dosyayı açarsanız ve hata sinyali NULL döndürülerek yapılırsa, alıcı kodun her dosyayı ayrı ayrı okumasını kontrol etmesi ve herhangi bir döngü ve benzeri yapıları kırması gerekir. Dağınık kod için mükemmel bir reçetedir. Bununla birlikte, bir istisna atarak hatayı işaretlemeyi seçerseniz, tüketen kod, istisnayı hemen ele almayı seçebilir veya işlev çağrıları arasında bile olabildiğince çok düzeyde kabarmasına izin verebilir. Bu, daha temiz kod için yapar.

Kavramsal olarak, bir dosyayı açarsanız ve bir şeyler ters giderse, o zaman bir değer döndürmek (hatta NULL) yanlıştır. Dönecek bir şeyin yok çünkü operasyonun bitmedi. NULL döndürmek, "Dosyayı başarıyla okudum ve içerdiği - hiçbir şey" in kavramsal karşılığıdır. Eğer ifade etmek istediğiniz şey buysa (yani NULL, söz konusu işlem için gerçek bir sonuç olarak mantıklıysa), o zaman elbette NULL döndürün, ancak bir hatayı işaret etmek istiyorsanız, istisnalar kullanın.

Tarihsel olarak, bu şekilde hatalar rapor edildi; çünkü C gibi programlama dilleri, dilin içine yerleştirilmiş istisnalarla ilgilenmiyordu ve önerilen yol (uzun atlamalar kullanarak) biraz kıllı ve karşı sezgisel.

Sorunun bir de bakım tarafı var: istisnalar dışında, arızayı gidermek için ekstra kod yazmanız gerekir; Bunu yapmazsanız, program erken ve zor başarısız olur (ki bu iyi). Hatalara işaret vermek için NULL değerini döndürürseniz, programın varsayılan davranışı hatayı yok saymak ve sadece dilden bağımsız olarak yoldaki bozulmaya neden olan veri, segfaults, NullReferenceExceptions seçeneğine kadar devam eder. Hatayı erken ve yüksek sesle bildirmek için, fazladan kod yazmanız gerekir ve ne olduğunu tahmin edin: sıkı bir son tarihte bıraktığınız kısım budur.


1

Daha önce de belirtildiği gibi, birçok dil bir boş göstericinin geçerliliğini yakalanabilir bir istisnaya dönüştürmez. Bunu yapmak nispeten modern bir hiledir. Boş gösterici sorunu ilk tanındığında, istisnalar henüz icat edilmemişti.

Boş işaretçilere geçerli bir durum olarak izin verirseniz, bu özel bir durumdur. Özel durumlarda taşıma mantığına ihtiyacınız var, çoğu zaman birçok yerde. Bu ekstra karmaşıklık.

Eğer potansiyel boş göstericilerle ile ilgilidir olsun ya da olmasın, yok istisna istisnai davalarına bakacak atar kullanmak, o istisnai durumlarda başka bir yol işlemesi gerekir. Genel olarak, her işlev çağrısında, işlev çağrısının uygun olmayan şekilde çağrılmasını engellemek veya işlevden çıktığında başarısızlık durumunu tespit etmek için bu istisnai durumlar için denetler olmalıdır. Bu istisnalar dışında kaçınılması gereken ekstra karmaşıklık.

Daha fazla karmaşıklık genellikle daha fazla hata anlamına gelir.

Veri yapılarında boş işaretçiler kullanmaya alternatifler (örneğin, bağlı bir listenin başlangıcını / bitişini işaretlemek için) sentinel öğelerini kullanmayı içerir. Bunlar aynı işlevselliği çok daha az karmaşıklıkla verebilir. Ancak, karmaşıklığı yönetmenin başka yolları da olabilir. Bir yol, potansiyel olarak boş göstericiyi bir akıllı işaretçi sınıfına sarmaktır, böylece boş denetimler yalnızca bir yerde gerekir.

Tespit edildiğinde boş gösterici hakkında ne yapmalı? İstisnai durum ele alma işlemini oluşturamazsanız, her zaman bir istisna atabilir ve bu özel durum ele alma işlemini arayana etkin bir şekilde devredebilirsiniz. Ve boş bir göstergeyi kaldırdığınızda bazı dillerin varsayılan olarak yaptığı tam olarak budur.


1

C ++ 'a özgü , ancak orada boş referanslar var, çünkü C ++' daki boş anlambilgisi işaretçi türleriyle ilişkili. Bir dosya açma fonksiyonunun başarısız olması ve bir boş gösterici döndürmesi oldukça mantıklıdır; aslında fopen()fonksiyon tam olarak bunu yapar.


Gerçekten de, C ++ 'ta boş bir referansla kendinizi bulursanız, bunun nedeni programınızın zaten bozuk olmasıdır .
Kaz Ejderha

1

Dile bağlıdır.

Örneğin, Objective-C, null (nil) nesnesine problemsiz bir mesaj göndermenizi sağlar. Nil'e yapılan çağrı nil değerini de döndürür ve bir dil özelliği olarak kabul edilir.

Ben şahsen bunu seviyorum, çünkü bu davranışa güvenebilir ve iç içe geçmiş tüm bu if(obj == null)yapıları önleyebilirsiniz .

Örneğin:

if (myObject != nil && [myObject doSomething])
{
    ...
}

Kısaltılabilir:

if ([myObject doSomething])
{
    ...
}

Kısacası, kodunuzu daha okunaklı hale getirir.


0

Belge ettiğiniz sürece null ya da bir istisna atıp atmamanız konusunda hiçbir fikrim yok.


Ve ayrıca adlandırın : GetAddressMaybeveya GetSpouseNameOrNull.
rwong

-1

Null başvurusu genellikle program mantığındaki bir şeyin kaçırılması nedeniyle oluşur, yani: bu kod bloğu için gerekli ayarları yapmadan bir kod satırına geçtiniz.

Öte yandan, eğer bir şey için bir istisna atarsanız, programın normal çalışmasında belirli bir durumun ortaya çıkabileceğini ve bunun ele alındığını belirtirsiniz.


2
Boş bir referans çok sayıda nedenden dolayı "ortaya çıkabilir", çok az kişi kaçırılan herhangi bir şeyle ilgili. Belki de boş bir referans istisnasıyla karıştırıyorsunuzdur .
Aaron

-1

Boş referanslar genellikle çok kullanışlıdır: Örneğin, bağlı listedeki bir öğenin halefi olabilir veya halefi olmayabilir. null"Halefi yok" için kullanmak tamamen doğaldır. Veya, bir kişinin eşi olabilir ya da olmayabilir - null"kişi eşi yok" için kullanmak tamamen doğaldır, "bazılarının eşi" olmamasından çok daha doğaldır - Person.Spouseüyenin önerebileceği özel değer .

Ancak: Birçok değer isteğe bağlı değildir . Tipik bir OOP programında, referansların yarısından fazlasının nullbaşlatma sonrasında olamayacağını veya programın başarısız olacağını söyleyebilirim . Aksi halde kodun if (x != null)kontrollerle karıştırılması gerekir. Öyleyse neden her referans varsayılan olarak geçersiz sayılmalıdır? Gerçekten de tam tersi olmalı: değişkenler varsayılan olarak geçersiz sayılmamalıdır ve açıkça "ah ve bu değer de olabilir" demelisiniz null.


Bu tartışmadan cevabınıza geri eklemek istediğiniz bir şey var mı? Bu yorum dizisi biraz ısındı ve bunu temizlemek istiyoruz. Herhangi bir genişletilmiş tartışma sohbet için yapılmalıdır .

Tüm bu çekişmelerin ortasında gerçek ilgi bir veya iki nokta olabilirdi. Maalesef, genişletilmiş tartışmayı geri bulana kadar Mark'ın yorumunu görmedim. Gelecekte, yorumları gözden geçirmek ve cevabınızı uygun şekilde düzenlemek için zamanınızı alana kadar yorumları korumak istiyorsanız, moderatörlerinizin ilgisini çekmek için lütfen cevabınızı işaretleyin.
Josh K

-1

Sorunuz kafa karıştırıcı biçimde ifade edildi. Boş bir başvuru istisnası mı demek istiyorsunuz (bu aslında bir girişimden kaynaklanır) dereferans null)? Bu istisna türünü istememenin açık nedeni, programın herhangi bir noktasında null değerine ayarlanmış olabileceği zaman, neyin yanlış gittiği hakkında size hiçbir bilgi vermemesidir. "Var olmayan bir dosyaya okuma erişimi talep edersem, o zaman bir istisna veya boş başvuru aldığım için tamamen mutluyum" - ancak nedenini belirtmeyen bir şey almaktan tamamen memnun olmamanız gerekir . Dizenin hiçbir yerinde "boşa çıkma denemesi yapılmaya çalışılmadı" herhangi bir okuma ya da var olmayan dosyadan söz edilmiyor. Belki de bir okuma çağrısından dönüş değeri olarak boşa çıkmaktan tamamen mutlu olacağınızı kastediyorsunuz - bu oldukça farklı bir konudur, ancak hala okumaların neden başarısız olduğu hakkında hiçbir bilgi vermemektedir; o'


Hayır, boş referans istisnası demek istemiyorum. Başlatılmamış, ancak bildirilen değişkenlerin bildiğim tüm dillerde bir null şekli var.
davidk01

Ancak sorunuz, başlatılmamış değişkenlerle ilgili değildi. Ve başlatılmamış değişkenler için null kullanmayan diller vardır, bunun yerine isteğe bağlı olarak bir değer içerebilen sarmalayıcı nesneleri kullanın - örneğin, Scala ve Haskell.
Jim Balter

1
"... ancak bunun yerine isteğe bağlı olarak bir değer içerebilen sarmalayıcı nesneleri kullanın ." Açıkça null gibi bir şey değildir .
Aaron,

1
Haskell'de başlatılmamış bir değişken diye bir şey yoktur. Potansiyel olarak bir IORef ilan edip No ile bir başlangıç ​​değeri olarak tohumlayabilirsiniz, ancak bu, başka bir dilde bir değişken tanımlamanın ve onu aynı sorunları getirecek şekilde başlatılmadan bırakmanın bir analogudur. IO monad haskell programcılarının dışındaki tamamen işlevsel çekirdekte çalışmak, referans türlerine başvurma şansına sahip olmadığı için boş referans sorunu olmaz.
davidk01

1
- Eğer istisnai bir "boş" bir değer olarak tamamen aynıdır; istisnai "Eksik" değeri varsa eğer bunu işlemek için kullanılabilir aynı araçları var. Bu önemli bir "eğer". Bu olayı ele almak için ekstra bir karmaşıklığa ihtiyacınız var. Haskell'de, desen eşleme ve tip sistemi bu karmaşıklığı yönetmenize yardımcı olacak bir yol sağlar. Bununla birlikte, diğer dillerde karmaşıklığı yönetmek için başka araçlar da vardır. İstisnalar böyle bir araçtır.
Steve314
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.