我的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值。
但据我所知,文档String.format应该永远不会返回NULL。
第二件事我不解读......我在第61行的定义与第204行没有关系,那么第204行如何成为这个例外的原因?
我找到了一个关于此Exceptiontype的相关主题,但它对我的问题没有帮助。 @see:ExceptionInInitializerError
UPDATE:当我将“user_sign”(第161行)更改为没有String.format()的静态字符串时,错误似乎不会出现。 也许String.format()不喜欢将“%s”作为参数之一插入?
答案 0 :(得分:0)
这是因为您的table_coloumn.eStatus
为空。我不知道为什么跟踪在不同的行上,但是如果你将table_coloumn.eStatus
初始化为适当的值,它应该开始工作。
如果你直接用String设置user_sign
,也不要问我为什么会这样。我也没有答案。可能是魔术......:P