2013-08-08 35 views
6

Nesne C, null değerlerine erişmeye çalışırsa Java neden sık sık boş gösterici istisnası atar?Java vs Nullpointer istisnası durumunda Objective C

Java:

public class SubscribeEmailActivity { 
    String status; 

    public static void main(String[] args){ 

     if(Status.equals(null)||status.equals(""){ 

      // i am getting error here 

     } 
    } 

} 

Objective C

:

//in .h file 
NSString *exp; 

//in .m file 
if ([exp isEqualToString:NULL] ||[exp isEqualToString:@""]) 
{ 
    // i am not getting any error 
} 
+9

Farklı diller oldukları için? Bir dilin null'da çağrı yöntemlerini nasıl ele alması gerektiğine dair kesin bir kural yoktur. Dilin geliştiricilerinin farklı sebeplerden dolayı verdiği bir karardır. – DrummerB

+0

Ben aynı şüphe var – ArunMak

+4

Ben Objective-c bilmiyorum, ama [exp isEqualToString: NULL] null için bir çek gibi bana değil, daha doğrusu "NULL" için bir kontrol ve null Java denetimi hiçbir anlamı yok . –

cevap

6

Sonuçta, tamamen bu sorunu çözmek için tek yol, farklı bir programlama dili kullanmaktır: Objective-C ise

  • , sen nil bir yöntemi çağrılırken eşdeğer yapabilir ve kesinlikle hiçbir şey olmaz . Bu, çoğu çek boşluğunu gereksiz kılar, ancak hataları teşhis etmek çok daha zorlaştırabilir.
  • Nice, Java türevli bir dilde, her türün iki sürümü vardır: potansiyel olarak boş bir sürüm ve null olmayan bir sürüm. Yalnızca null olmayan türlerde yöntemleri çalıştırabilirsiniz. Potansiyel olarak null türler, null için açık denetimle boş olmayan türlere dönüştürülebilir. Bu, null çeklerin gerekli olduğunu ve nerede olmadıklarını bilmek daha kolay hale getirir.

    Status status = null; 
    if("".equals(status)){ 
        //.... 
    } 
    

    : Bu muhtemelen sorunuza cevap vermez

7
sorun java daki değerlendirmede ise

, olması gerektiği:

if(status == null||status.equals("")) { 
    //Do not try to dereference status.... 

Bu sadece unutulmamalıdır Java ve diğer diller, mantıksal değerlendirmelerde kısa kesintilere izin verdiği için çalışır. Bu durumda bazı basit boolean cebir: İlk dönem kez

true || ??? => true 

doğru olarak değerlendirilir biz VEYA şartlı da doğru olarak değerlendirecektir, biliyorum, ikinci dönem incelemeye gerek yoktur.

Ayrıca Apache Commons isEmpty() kullanabilir veya kendi dönebilirsiniz:

public static final boolean isEmpty(String arg0) { 
    if(arg0 == null) return true; 
    if(arg0.trim().length() < 1) return true; 
    return false; 
} 

gösterilen versiyon Apache Commons içinde isBlank benzer.

+0

status.equals ("") status.isEmpty() – Carnal

+0

olarak da yazılabilir. Aslında her iki çağrıyı da "" ".equals (status)" diyerek engelleyebilirsiniz. Bu şekilde '.equals()' yöntemi boş bir nesne üzerinde * hiçbir zaman * çağrılmaz ve aynı zamanda "durum" null olduğunda dize boşsa test edilirsiniz. – tomacco

2

status değişkeni, Java'da null ise, status.equals() numaralı telefonu aramaya çalışmak NullPointer istisnasını atar. isEqualToString, Objective-C dizelerinin bir üyesi işlevini değil, yalnızca bir dizeyi ve bir nesneyi karşılaştırır.

+1

isEqualToString: (kolon önemli) sınıf NSString yöntemidir. Farkı gerçekten açıklamak için – Fred

4

, ama bir kural bir boş gösterici istisna önlemek ve aynı zamanda bir boş çek önlemek için, böyle çek ters etmektir hangi yanlış dönecek.

kullanırken:

if(status.equals("")){ 
} 

bir NPE İstisna atar.

+0

+1 – Carnal

2

Sadece dilin nasıl tasarlandığı meselesi. Eğer yeterince cesaretiniz varsa, objc_msgSend'in nasıl çalıştığını ve nil nesnelere neden mesaj gönderebileceğinizi görmek için here bir göz atabilirsiniz.

4

Objektif C yöntemindeki çağrıların, gönderme mesajına eşdeğer olduğu kabul edilir ve nil'a bir mesaj gönderilmez. Bu, Java'da gerekli olacak boş kontrolleri yazmak zorunda kalmamanız anlamına gelir, bu da daha kompakt kod yazabilen programcılara daha uygundur. Diğer yandan, aynı zamanda bir hata da olabilir: Gerçek bir nesneye bir ileti göndermeyi ancak bunun yerine, nil adresine göndermeyi düşünüyorsanız, C nesnesinde bir uyarı almayacaksınız demektir. Java'da bu işlem, bir NullPointerException'un atılmasına neden olarak, bir hata yaptığınızı açıkça belirtir.

Dil tasarımcıları kolaylık ve güvenlik arasında bir geçiş yapmak zorunda olduklarından, hiçbir seçenek nesnel olarak daha iyi değildir. Objective C tasarımcıları, bir kara delik olarak nil'u uygulamaya karar verdiler: attığınız her şeyi yutar. Java tasarımcıları, null ile açık bir hata oluşturduğunda daha iyi olduğuna karar verdi. Gerçekten daha fazla bir şey yok. Kodunuzdaki

if(Status.equals(null)||status.equals("") yılında

2

Eğer null Bir dize (boş bir dize değildir) karşılaştırıyoruz.

Dize ile Dize arasında karşılaştırma yapmak mümkün değildir. iOS kodlama durumunda i nedenle çalıştığını,

[exp isEqualToString:NULL]

olarak null veya sıfır aynıdır ve daha sonra karşılaştırmak hiçbir şey argüman dönüştürür inanıyoruz.