2012-04-26 16 views
2

私は他の人と書いたプログラムのローカリゼーションに取り組んでいます。ほとんどの文字列は、iniファイルから適切な言語でロードされます。私はプログラムで通貨の形式で同じことをしようとしています。しかし、アプリケーションを起動しようとするとすぐにランタイム例外が発生します。Java:Localeオブジェクトの作成時にNullPointerExceptionが発生するExceptionInInitializerError

私はそうのように、いくつかのNumberFormat.getCurrencyInstance()のパラメータとしてロケールオブジェクトを使用しています:

private static final NumberFormat decf; 
static 
{ 
    decf = NumberFormat.getCurrencyInstance(Lang.cLocale); 
    decf.setRoundingMode(RoundingMode.HALF_UP); 
} 

ラングは、すべてのローカライゼーションのものが含まれているクラスです。 IDEが実行時に不満を表明しているコードはpublic static Locale cLocale = new Locale(GUI.DB_info[19],GUI.DB_info[20]);

です。GUIはGUIが含まれているクラスで、DB_info配列を構築することに決めました(別のクラスのリモートデータベースからロードされた情報だけを含んでいます)。 DB_info [19]は言語コード(今はes)、DB_info [20]は国コード(US)です。配列の要素が適切に埋められているか、今のところ私はプログラムの中で十分に理解できません。 DB_infoを埋め込むためのコードは変更されていません。 static String welcome = Lang.L_WELCOME + ", " + empName;、およびLang.javaは基本的に次のようになります:

が参照GUIで行が
Exception in thread "main" java.lang.ExceptionInInitializerError 
at greetingCard.GUI.<clinit>(GUI.java:118) 
Caused by: java.lang.NullPointerException 
at java.util.Locale.<init>(Unknown Source) 
at java.util.Locale.<init>(Unknown Source) 
at greetingCard.Lang.<clinit>(Lang.java:13) 
... 1 more 

で次のように

いっぱい例外はある文字列の大多数のためだ

// Set locale for currency display 
public static Locale cLocale = new Locale(GUI.DB_info[19],GUI.DB_info[20]); // language, country 

// Employee specific strings 
public static String L_AMT_REMAIN = ""; 
public static String L_AMT_TEND = ""; 
public static String L_APPROVED = ""; 
public static String L_ARE_YOU_SURE = ""; 
[...] 

public static void Main(String emp_lang) 
{ 
    String header = ""; 

    if (emp_lang.equals("ENG")) 
    { 
     header = "ENG"; 
    } 
    else if (emp_lang.equals("SPA")) 
    { 
     header = "SPA"; 
    } 
    else if (emp_lang.equals("FRE")) 
    { 
     header = "FRE"; 
    } 
    else if (emp_lang.equals("GER")) 
    { 
     header = "GER"; 
    } 
    else 
    { 
     header = "ENG"; 
    } 

    try 
    { 
     Ini ini = new Ini(new File("C:/lang.ini")); 

     L_AMT_REMAIN = ini.get(header, "L_AMT_REMAIN"); 
     L_AMT_TEND = ini.get(header, "L_AMT_TEND"); 
     L_APPROVED = ini.get(header, "L_APPROVED"); 
     L_ARE_YOU_SURE = ini.get(header, "L_ARE_YOU_SURE"); 
        [...] 
           L_WELCOME = ini.get(header, "L_WELCOME"); 
     L_WELCOME2 = ini.get(header, "L_WELCOME2"); 
     L_XACT_CHNG = ini.get(header, "L_XACT_CHNG"); 
     L_YES = ini.get(header, "L_YES"); 

     System.err.println("Employee Language: " + header); 
    } 
    catch (InvalidFileFormatException e) 
    { 
     e.printStackTrace(); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
} // end public static void main 

異なる言語で表示することができます。 Lang内には、最初のセットとは独立した他の文字列を読み込む別のメソッドがあります。私はそれがこの問題の要因であるとは思わないが、必要に応じて投稿できる。

これらのクラス/メソッドの起動順序は次のとおりです。 GUI.Mainは、CreateLoginメソッドを呼び出すLoginクラスを呼び出します。このメソッドは、Clients.mainを呼び出して、渡されたGUIからDB_info配列を取得します。クライアントはDB_info配列を塗りつぶします。 Lang.otherが呼び出され(ログインページの言語固有の文字列を取得するため)、ログインボタンとラベルが作成されます。ログインが成功すると、DBからログインした従業員の言語がLang.mainに渡され、他の文字列が読み込まれます(したがって、上記のコードで渡されたemp_lang)。

Localeオブジェクトのコードを追加するまで、これまではすべて正常に機能していました。 ExceptionInInitializerError例外が発生しました。誰が何が起こっているのか知っていますか?

私はiniファイルからロードするために、私はini4jを使用しています。私が見つけたいくつかのフォーラム投稿は、これが問題であることを示唆していますが、Localeオブジェクトの問題にどのように関連しているのか分かりません。 iniのものはうまく動作します。

答えて

5

スタティックイニシャライザにサイクルがあるように聞こえるので、何かがまだ初期化されていません。

GUILang.L_WELCOMEを取得する前にLangの静的初期化子を呼び出します。 Langは、2行目のGUIの静的初期化子を呼び出します。例外トレースは、何らかの理由でがLangの静的初期化子を呼び出すようにします。

このようなサイクルでは、誰かが静的に初期化されたオブジェクトを参照し、取得する予定の代わりにnullを取得することになります。この場合、私は、の2行目がLocaleコンストラクタに2つのnullポインタを渡していると思われます。

+1

あなたは正しいです。いくつかのイニシャライザを再配置し、ローカリゼーションコードを2つのメソッドに分割して、必要なときにすべてが呼び出されるように修正しました。 – electrickoolaid42

+1

私たちが必要とした単なる手掛かりに違いはありましたが、何らかの形で関連する問題でした。 Tks。 – wwkudu

0

キースは、静的なイニシャライザサイクルがあることに注意してください。

はので、ここで、これらのバグを最小限に抑える(複雑な) 変数前(なしまたは最小限のコンストラクタを持つ)(シンプル) 定数を初期化するには...未来の読者を助けるために String Locale前 - 引き起こすサイクルにはあま​​り部屋問題。

デバッグ通り、静的フィールドにNullPointerExceptionとスタックトレースで2 <clinit>は、以前のクラスが失敗ラインに現れると、これは静的初期化サイクルによって引き起こさ非初期化フィールドであることを手がかりです。

関連する問題