なぜこのコードはNullPointerExceptionをスローするのですか?

ティベリウス:

次のJavaソースを検討してください。

if( agents != null ) {
  for( Iterator iter = agents.keySet().iterator(); iter.hasNext(); ) {
    // Code that uses iter.next() ...
    //
  }
}

agentsですHashMap

forステートメントが時々をスローするのはなぜNullPointerExceptionですか?

ありがとうございました。

Dave Jarvis:

スレッドセーフティ

コードがマルチスレッドの場合、それは可能です。例えば:

public class C {
  private Hashtable agents = new Hashtable();

  public iterate() {
    if( agents != null ) {
      for (Iterator iter = agents.keySet().iterator(); iter.hasNext();) {
        // Code goes here
      }
    }
}

ステートメントの実行直後(ただしループの)に別のスレッドが設定さagentsれている場合、を取得します。アクセサ(遅延初期化と組み合わせて)を使用してこれを回避します。nullifforNullPointerException

また、他の人が述べたように、可能であればジェネリックを優先してこのようなループ構造を避けてください。詳細については、他の回答を参照してください。

アクセサは保護を提供します

常に次のパターンを使用する場合NullPointerException、ソースコードにが含まれることは決してありません(一方で、サードパーティのコードには、コードを間接的に失敗させる問題があり、簡単に回避することはできません)。

public class C {
  private Hashtable agents;

  private synchronized Hashtable getAgents() {
    if( this.agents == null ) {
      this.agents = new Hashtable();
    }

    return this.agents;
  }

  public iterate() {
    Hashtable agents = getAgents();

    for (Iterator iter = agents.keySet().iterator(); iter.hasNext();) {
      // Code goes here
    }
  }
}

エージェントを反復するコードでは、を確認する必要がなくなりましたnullこのコードは、多くの理由ではるかにロボストです。の代わりにHashmap(またはなどの他の抽象データ型ConcurrentHashMap<K,V>)を使用できHashtableます。

開閉原理

あなたがあなたの時間に特に寛大であると感じていたなら、あなたは次のように行くことができます:

public class C {
  private Hashtable agents;

  private synchronized Hashtable getAgents() {
    if( this.agents == null ) {
      this.agents = createAgents();
    }

    return this.agents;
  }

  public iterate() {
    Iterator i = getAgentKeyIterator();

    while( i.hasNext() ) {
      // Code that uses i.next() ...
    }
  }

  protected Hashtable createAgents() {
    return new Hashtable();
  }

  private Iterator getAgentKeyIterator() {
    return getAgentKeys().iterator();
  }

  private KeySet getAgentKeys() {
    return getAgents().keySet();
  }
}

これにより、(他の開発者によって作成された)サブクラスが、使用されている抽象データ型の独自のサブクラスを置き換えることができるようになり(システムがOpen-Closed Principleに準拠する際の柔軟性が高まり)、オリジナルを変更(またはコピー/廃棄)する必要がなくなります。作業。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

なぜこのコードはNullPointerExceptionをスローするのですか?

分類Dev

このコードがNullPointerExceptionをスローするのはなぜですか?

分類Dev

このコードがNullPointerExceptionをスローするのはなぜですか?

分類Dev

Javaのこのコードでnullpointerexceptionがスローされるのはなぜですか?

分類Dev

なぜこのコードはjava ConcurrentModificationExceptionをスローするのですか?

分類Dev

このコードが例外をスローするのはなぜですか

分類Dev

このコードが MalformedURLException をスローするのはなぜですか?

分類Dev

このコードがNullPointerExceptionをスローしないのはなぜですか

分類Dev

このコードがNullPointerExceptionをスローしないのはなぜですか?

分類Dev

アイコン処理コードがNullPointerExceptionをスローするのはなぜですか?

分類Dev

ListChangeBuilderがNullPointerExceptionをスローするのはなぜですか?

分類Dev

なぜこのコードはConcurrentModificationExceptionをスローしないのですか?

分類Dev

このScalaコードがNullPointerExceptionを返すのはなぜですか?

分類Dev

なぜこのコードはNullPointerExceptionを返さないのですか?

分類Dev

この単純なコードがArrayIndexOutOfBoundsExceptionをスローするのはなぜですか?

分類Dev

このコードがIndexOutOfBoundsエラーをスローするのはなぜですか?

分類Dev

このコードが「System.ArgumentOutOfRangeException」(SQlite)をスローするのはなぜですか?

分類Dev

このコードが自動マッピング例外をスローするのはなぜですか?

分類Dev

newInstanceがコードでInstantiationExceptionをスローするのはなぜですか?

分類Dev

このコードが10個の最新の投稿をロードするのはなぜですか?

分類Dev

この正確な例外が私のc ++コードでスローされるのはなぜですか?

分類Dev

このC#コードがプロセスをクラッシュさせるのはなぜですか?

分類Dev

このコードが「潜在的なリソースリーク」の警告を生成するのはなぜですか?

分類Dev

String.valueOf(null)がNullPointerExceptionをスローするのはなぜですか?

分類Dev

NumberFormat.formatがNullPointerExceptionをスローするのはなぜですか?

分類Dev

モックがnullpointerexceptionをスローするのはなぜですか?

分類Dev

このコードがこの順序で実行されるのはなぜですか?プロセスフローの説明を探しています

分類Dev

スペースを追加すると、このHaskellコードが無効になるのはなぜですか?

分類Dev

C:なぜこのコードはこれを出力するのですか?

Related 関連記事

  1. 1

    なぜこのコードはNullPointerExceptionをスローするのですか?

  2. 2

    このコードがNullPointerExceptionをスローするのはなぜですか?

  3. 3

    このコードがNullPointerExceptionをスローするのはなぜですか?

  4. 4

    Javaのこのコードでnullpointerexceptionがスローされるのはなぜですか?

  5. 5

    なぜこのコードはjava ConcurrentModificationExceptionをスローするのですか?

  6. 6

    このコードが例外をスローするのはなぜですか

  7. 7

    このコードが MalformedURLException をスローするのはなぜですか?

  8. 8

    このコードがNullPointerExceptionをスローしないのはなぜですか

  9. 9

    このコードがNullPointerExceptionをスローしないのはなぜですか?

  10. 10

    アイコン処理コードがNullPointerExceptionをスローするのはなぜですか?

  11. 11

    ListChangeBuilderがNullPointerExceptionをスローするのはなぜですか?

  12. 12

    なぜこのコードはConcurrentModificationExceptionをスローしないのですか?

  13. 13

    このScalaコードがNullPointerExceptionを返すのはなぜですか?

  14. 14

    なぜこのコードはNullPointerExceptionを返さないのですか?

  15. 15

    この単純なコードがArrayIndexOutOfBoundsExceptionをスローするのはなぜですか?

  16. 16

    このコードがIndexOutOfBoundsエラーをスローするのはなぜですか?

  17. 17

    このコードが「System.ArgumentOutOfRangeException」(SQlite)をスローするのはなぜですか?

  18. 18

    このコードが自動マッピング例外をスローするのはなぜですか?

  19. 19

    newInstanceがコードでInstantiationExceptionをスローするのはなぜですか?

  20. 20

    このコードが10個の最新の投稿をロードするのはなぜですか?

  21. 21

    この正確な例外が私のc ++コードでスローされるのはなぜですか?

  22. 22

    このC#コードがプロセスをクラッシュさせるのはなぜですか?

  23. 23

    このコードが「潜在的なリソースリーク」の警告を生成するのはなぜですか?

  24. 24

    String.valueOf(null)がNullPointerExceptionをスローするのはなぜですか?

  25. 25

    NumberFormat.formatがNullPointerExceptionをスローするのはなぜですか?

  26. 26

    モックがnullpointerexceptionをスローするのはなぜですか?

  27. 27

    このコードがこの順序で実行されるのはなぜですか?プロセスフローの説明を探しています

  28. 28

    スペースを追加すると、このHaskellコードが無効になるのはなぜですか?

  29. 29

    C:なぜこのコードはこれを出力するのですか?

ホットタグ

アーカイブ