我正在为我和其他几个人编写的程序进行本地化。大多数字符串现在以适当的语言从 ini 文件加载。我正在尝试对程序中的货币格式执行相同的操作。但是,当我尝试启动应用程序时,我就会收到运行时异常。
我使用 Locale 对象作为一些 NumberFormat.getCurrencyInstance() 的参数,如下所示:
private static final NumberFormat decf;
static
{
decf = NumberFormat.getCurrencyInstance(Lang.cLocale);
decf.setRoundingMode(RoundingMode.HALF_UP);
}
Lang 是包含所有本地化内容的类。 IDE 在尝试运行时抱怨的代码是public static Locale cLocale = new Locale(GUI.DB_info[19],GUI.DB_info[20]);
GUI 是包含 GUI 的类,我们决定在其中构造 DB_info 数组(它本身只包含从另一个类中的远程数据库加载的信息)。 DB_info[19] 是语言代码(现在是),DB_info[20] 是国家代码(美国)。数组元素正在被正确填充——或者说,我现在无法深入了解程序来判断;但填充 DB_info 的代码没有任何改变。
完整的异常如下:
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
GUI 中引用的行是:static String welcome = Lang.L_WELCOME + ", " + empName;
,而 Lang.java 基本上看起来像这样:
// 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 调用 Login 类,该类调用 CreateLogin 方法。该方法调用 Clients.main,后者从传递给它的 GUI 获取 DB_info 数组。客户端填充 DB_info 数组。然后调用 Lang.other(以获取登录页面的特定于语言的字符串),并创建登录按钮和标签。登录成功后,登录员工的首选语言(从数据库)将传递到 Lang.main 以加载其他字符串(因此 emp_lang 在上面的代码中传递)。
在我添加 Locale 对象的代码之前,所有这些都工作正常。现在我收到 ExceptionInInitializerError 异常。有人知道发生了什么事吗?
顺便说一句,为了从 ini 文件加载,我使用 ini4j。我在谷歌搜索时发现的一些论坛帖子表明这是一个问题,但我不明白它与 Locale 对象的问题有什么关系。 ini 的东西工作得很好。