2013-08-08 12 views
6

Objective Cがnull値にアクセスしようとするとJavaが頻繁にnullポインタ例外をスローするのはなぜですか?nullpointer例外の場合のJava対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:問題はJavaで、あなたの評価である

//in .h file 
NSString *exp; 

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

異なる言語なので、言語が 'null 'の呼び出しメソッドをどのように扱わなければならないかという絶対的なルールはありません。さまざまな理由から、言語の開発者が決定したことです。 – DrummerB

+0

私は同じ疑問を持っています – ArunMak

+4

Objective-cはわかりませんが[exp isEqualToString:NULL]はnullのチェックのように私には聞こえませんが、むしろ "NULL"のチェックとnullのJavaチェックは意味をなさない。 –

答えて

6

完全にこの問題を解決する唯一の方法は、さまざまなプログラミング言語を使用することです最終的には、:Objective-Cで

  • 、あなたは皆無でメソッドを呼び出すと同等のものを行うことができ、そして絶対に何も起こりません。これによりほとんどのヌルチェックは不要になりますが、エラーを診断するのがずっと難しくなります。
  • Javaで派生したニースには、潜在的にnullのバージョンとnullでないバージョンの2種類があります。 not-null型でのみメソッドを呼び出すことができます。潜在的にnullの型は、nullを明示的に検査することによって、非null型に変換できます。これにより、ヌルチェックが必要な場所とそうでない場所を簡単に知ることができます。
7

、それは次のようになります。

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

それは、この唯一のことに留意すべきですJavaやその他の言語では、論理評価の短縮を可能にするため、機能します。この場合、いくつかの簡単なブール代数:

true || ??? => true 

第1項はtrueと評価されたら、私たちは、OR条件もtrueに評価され、第二項を検討する必要がないことを知っています。

また、あなたは、Apache CommonsのisEmpty()を使用するか、または独自のロールすることができます

​​

示されたバージョンは、Apache Commonsの中isBlankに似ています。

+0

status.equals( "")もstatus.isEmpty()として書くことができます。 – Carnal

+0

実際には両方の呼び出しが '' ".equals(status)'を呼び出すことで回避できます。このようにして、 '.equals()'メソッドはヌルオブジェクトに対して呼び出されることはありません。同時に、 'status'がnullでないときに文字列が空であるかどうかをテストします。 – tomacco

2

変数statusがJavaでnullの場合、status.equals()を呼び出そうとするとNullPointer例外がスローされます。 isEqualToStringはObjective-C文字列のメンバ関数ではなく、単に文字列とオブジェクトを比較します。

+1

isEqualToString :(コロンが重要です)は、NSStringクラスのメソッドです。 – Fred

4

これはおそらく、あなたの質問に答えることはありませんが、一つのルールは、nullポインタ例外を避けるために、同じ時間にはnullチェックを避けるため、このようなチェックを逆数にある:

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

falseを返します。

使用中:

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

は、NPE例外がスローされます。

+0

+1は本当に違いを説明する – Carnal

2

これは言語がどのように設計されているかの問題です。 hereあなたが勇気があるなら、objc_msgSendのしくみと、なぜnilオブジェクトにメッセージを送ることができるかを見てみることができます。

4

Objective Cのメソッド呼び出しでは、メッセージの送信と同等とみなされ、nilにメッセージを送信しても何も行われません。これは、Javaで必要とされるヌルチェックを書く必要がないことを意味します。これは、よりコンパクトなコードを書くことができるプログラマーにとって、より便利です。

一方、実際のオブジェクトにメッセージを送信する代わりにnilにメッセージを送信する予定がある場合は、Objective Cでは警告は表示されません。 Javaでは、この操作によりNullPointerExceptionがスローされ、バグがあることが明確になります。

言語設計者は利便性と安全性との間でトレードオフを行う必要があるため、どちらのオプションも客観的に優れていません。 Objective Cの設計者は、nilをブラックホールとして実装する方が良いと判断しました。 Javaの設計者は、nullを処理すると明示的なエラーが発生した方が良いと判断しました。本当にそれ以上のことはありません。

2
あなたのコードで

if(Status.equals(null)||status.equals("")ます(nullは文字列ではありません)nullに文字列を比較しています。

文字列を非文字列と比較することはできません。 iOS版の場合 は私が

[exp isEqualToString:NULL]

がnullかnilが同じであるとして何も引数を変換し、それを比較し、そのため、それが動作することを信じているコーディング。