6

Objective C が null 値にアクセスしようとすると、Java が頻繁に null ポインタ例外をスローするのはなぜですか?

ジャワ:

public class SubscribeEmailActivity {
    String status;

    public static void main(String[] args){

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

            // i am getting error here

        }
     }

}

目標 C:

//in .h file
NSString *exp;

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

7 に答える 7

7

問題はJavaでの評価にあります。次のようになります。

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

これが機能するのは、Java やその他の言語が論理評価のショートカットを許可しているからであることに注意してください。この場合のいくつかの単純なブール代数:

true || ??? => true

最初の項が true と評価されると、OR 条件も true と評価されることがわかります。2 番目の項を調べる必要はありません。

さらに、Apache Commons を使用することもisEmpty()、独自のものを展開することもできます。

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

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

于 2013-08-08T13:39:01.150 に答える
6

最終的に、この問題を完全に解決する唯一の方法は、別のプログラミング言語を使用することです。

  • Objective-C では、nil でメソッドを呼び出すのと同じことを行うことができ、まったく何も起こりません。これにより、ほとんどの null チェックが不要になりますが、エラーの診断がはるかに難しくなる可能性があります。
  • Java 派生言語である Nice では、すべての型に 2 つのバージョンがあります。潜在的に null のバージョンと非 null のバージョンです。null 以外の型でのみメソッドを呼び出すことができます。null の可能性がある型は、null を明示的にチェックすることで非 null 型に変換できます。これにより、null チェックが必要な場所と不要な場所を簡単に知ることができます。
于 2013-08-08T13:41:26.210 に答える
4

これはおそらくあなたの質問には答えませんが、null ポインター例外を回避し、同時に null チェックを回避する 1 つのルールは、次のようにチェックを逆にすることです。

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

false を返します。

使用中:

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

NPE 例外をスローします。

于 2013-08-08T13:43:14.893 に答える
4

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

一方で、これはエラーの原因になることもあります。実際のオブジェクトにメッセージを送信することを期待していたが、実際のオブジェクトに送信した場合nil、Objective C では警告が表示されません。Java では、この操作により aNullPointerExceptionがスローされ、バグがあることが明らかになります。

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

于 2013-08-08T13:48:54.837 に答える
2

あなたのコードで

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

文字列を非文字列と比較することはできません。iOSコーディングの場合、私はそれを信じています

[exp isEqualToString:NULL]

nullまたはnilが同じであるため、引数を何も変換せずに比較するため、機能します。

于 2013-08-08T13:49:14.527 に答える
2

それは、言語がどのように設計されているかの問題です。勇気があればここを見て、objc_msgSend がどのように動作し、なぜ nil オブジェクトにメッセージを送信できるのかを確認してください。

于 2013-08-08T13:44:37.413 に答える
2

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

于 2013-08-08T13:40:04.610 に答える