私は他の人と書いたプログラムのローカリゼーションに取り組んでいます。ほとんどの文字列は、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は基本的に次のようになります:
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のものはうまく動作します。
あなたは正しいです。いくつかのイニシャライザを再配置し、ローカリゼーションコードを2つのメソッドに分割して、必要なときにすべてが呼び出されるように修正しました。 – electrickoolaid42
私たちが必要とした単なる手掛かりに違いはありましたが、何らかの形で関連する問題でした。 Tks。 – wwkudu