2017-04-01 13 views
0

この質問の回答に続いて:How can I initialise a static Map?私のプロジェクトで静的なマップを作成しようとしています。コードスニペットの下
静的マップの初期化:null値が返される

public class MyClass { 

    public static final Map<String, String> dataMap; 

    static { 
     Map<String, String> tempMap = new HashMap<String, String>(); 
     try { 
      // Getting a string value from a file, e.g. String data 
      String data = "data"; 
      tempMap.put("firstData", data); 
     } 
     catch(Exception e) {} 

     dataMap = Collections.unmodifiableMap(tempMap); 

     //DEBUG (I test it and it correctly prints "data") 
     System.out.println(dataMap.get("firstData")); 
    } 
} 

は、その後、私はこのように、別のクラスにマップを呼び出す:

public class AnotherClass { 

    @Before 
    public void MyMethod() { 
     System.out.println(MyClass.dataMap.get("firstData")); 
    } 

    @Test 
    public void testMethod() {} 
} 

今は代わりに値「データ」の、nullを印刷します。
なぜですか?

+0

いいえ、ありません。しかし、それはコンパイルされていないので、あなたの本当のコードではありません。 –

+0

なぜこのコードをコンパイルできないのですか? – PenguinEngineer

+0

MyMethodにセミコロンがないためです。問題を再現した完全な最小例を投稿してください。私はこのコードを取って修正し、MyMethodを呼び出すメインメソッドを追加すると、(私が予想したように)エラーを再現することができません。 –

答えて

0

あなたのマップは他の場所では変更されていませんか(クリアされましたか...)? このコードは機能するはずです。

"final"を使用しているときは、 "unmodifiableMap"は便利ではないと考えています。マップが参照によって変更されないように保護しています。したがって、値は外部呼び出しによって変更される可能性があります。

+0

唯一の違いは、メソッドMyMethodには、 – PenguinEngineer

+3

のunmodifiableMap()が非常に重要なため、@Beforeアノテーションで注釈が付けられているようです。さもなければ、それはおそらく望ましくないかもしれませんが、どこからでもそのマップへの参照を取得し、それをクリアする(または要素を追加/削除する)ことができます。 –

+0

@PenguinEngineerは問題を再現した完全な最小例を投稿します。 –

0

私のマシンで同じコードを実行すると、作業してdataを2回見ただけで印刷できます。このコードは問題ではありません。

UPDATE: 多分MyClassがあなたのパッケージに別のMyClassを参照してください? インポートを確認してください.. コンパイルしてコマンドラインから実行して、同じ結果が得られるかどうかを確認してください。ここに不足しているものがあります。

関連する問題