【问题标题】:ExceptionInInitializerError with From String.format带有 From String.format 的 ExceptionInInitializerError
【发布时间】:2015-08-20 04:08:54
【问题描述】:

我在我的 Android 应用程序中对 String.format 有一个奇怪的行为,我不明白...

我尝试在接口中进行一些静态定义。这也很好,但在某些情况下我得到一个例外:

E/AndroidRuntime(32450): java.lang.ExceptionInInitializerError
E/AndroidRuntime(32450):    at de.mydomain._defines_database$query.<clinit>(_defines_database.java:61)
E/AndroidRuntime(32450):    at de.mydomain.MyActivity.onCreate(MyActivity.java:116)
....
E/AndroidRuntime(32450): Caused by: java.lang.NullPointerException: format == null
E/AndroidRuntime(32450):    at java.lang.String.format(String.java:1995)
E/AndroidRuntime(32450):    at java.lang.String.format(String.java:1973)
E/AndroidRuntime(32450):    at de.mydomain._defines_database$table_coloumn.<clinit>(_defines_database.java:204)
E/AndroidRuntime(32450):    ... 16 more

我在 _defines_database 中的代码:

Line  17: public interface _defines_database
Line  18: {
Line  19:   public interface query
Line  20:   {
...
Line  61:     public final static String eOrder      = table_coloumn.eStatus+" DESC, ";
...
Line 160:     public final static String  person_sign= "SELECT sign_%2$s FROM %1$s WHERE id_%2$s = %3$s";
Line 161:     public final static String user_sign   = String.format(person_sign,"user", "usr","%s"); 
Line 162:
Line 163:   }
...
...
Line 178:   public interface table_coloumn
Line 179:   { 
...
Line 183:     public final static String eStatus = "(CASE"
Line 184:                                        + "  WHEN `end_time` IS NOT NULL THEN '"+ Status.STOPPED.ordinal() +"'\n"
Line 185:                                        + "  WHEN `start_time`  IS NOT NULL THEN '"+ Status.STARTED.ordinal() +"'\n"
Line 186:                                        + "  ELSE '"+ Status.PLANNED.ordinal() +"'\n "
Line 187:                                        + "END)";
...
Line 204:     public final static String userTour = "name_tour || ' (' || ("+ String.format(query.user_sign,"user_tour")+ ")  || ')'";
...
Line 304:   }
Line 305: }

所以我不明白的是:1.第 61 行抛出异常,但原因是第 204 行,原因是字符串格式为空。

但所有变量都来自静态最终字符串,所以它们永远不应该被改变。 所以第 204 行中的“format”参数只能为 NULL,第 161 行中的 String.format 将返回 NULL-Value。

但据我了解,文档 String.format 永远不应返回 NULL。

我不明白的第二件事......我在第 61 行的定义与第 204 行无关,那么第 204 行怎么会是这个异常的原因呢?

我找到了有关此 Exceptiontype 的相关主题,但它对我的问题没有帮助。 @见:ExceptionInInitializerError

更新:当我将“user_sign”(第 161 行)更改为没有 String.format() 的静态字符串时,似乎不会发生错误。 也许 String.format() 不喜欢将“%s”作为参数之一插入??

【问题讨论】:

  • 这也很好,但在某些cases 中我得到了一个例外。在哪些情况下?
  • 我无法重建这种情况,但我在后台一段时间后返回我的应用程序后触发了异常。我知道当内存不足时android会清除所有变量,但静态最终接口konstands应该会自动恢复。引发错误是因为此初始化步骤出现问题。
  • 你确定没有其他例外吗?
  • 是的,我是,它只有一个例外,还有一个例外,因为我有一个例外的文本记录,我还观看了 LogCat。 (请参阅我帖子中的登录信息)

标签: java android string format


【解决方案1】:

这是因为您的 table_coloumn.eStatus 为空。我不知道为什么跟踪在不同的行,但如果你将table_coloumn.eStatus 初始化为适当的值,它应该开始工作。

如果你也直接用字符串设置user_sign,不要问我为什么它会起作用。我也没有答案。可能是魔法……:P

【讨论】:

  • eStatus 不是 Null,我刚刚忘记发布第 183-187 行(现在您可以看到这些行了)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 2012-06-16
  • 2016-05-03
  • 1970-01-01
相关资源
最近更新 更多