此代码直到几天前才起作用。现在,它不再在Android版本6.0上使用。它确实可以在7.0版和更新版本上使用。
public void setToDate(String quickDate) {
DateTime toDate = new DateTime();
if (quickDate.equals(context.getString(R.string.quickDate_today))) {
fromDate = fromDate.withTimeAtStartOfDay();
toDate = DateUtils.endOfDay(toDate);
}
....
}
/**
* @return a copy of dateTime with the time set to 11:59:59.999 pm.
*/
public static DateTime endOfDay(DateTime dateTime) {
return dateTime.withTime(23, 59, 59, 999);
}
这是奇怪的事情,如果我将withtime()调用直接调用,而不是在类似的实用程序方法中进行:
:public void setToDate(String quickDate) {
DateTime toDate = new DateTime();
if (quickDate.equals(context.getString(R.string.quickDate_today))) {
fromDate = fromDate.withTimeAtStartOfDay();
toDate = toDate.withTime(23, 59, 59, 999);
}
....
}
然后代码有效,没有例外。为什么?如何在实用方法中再次工作?
堆栈跟踪:
Process: com.salesrabbit.android.sales.universal, PID: 29358
java.lang.ExceptionInInitializerError
at com.salesrabbit.android.sales.universal.canvass.filter.filters.Filter.setQuickFromAndToDates(Filter.java:273)
at com.salesrabbit.android.widget.FilterView.lambda$loadQuickDateMenu$3$FilterView(FilterView.java:203)
at com.salesrabbit.android.widget.FilterView$$Lambda$3.onMenuItemClick(Unknown Source)
at android.support.v7.widget.PopupMenu$1.onMenuItemSelected(PopupMenu.java:108)
at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:822)
at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:171)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:973)
at android.support.v7.view.menu.MenuPopup.onItemClick(MenuPopup.java:127)
at android.widget.AdapterView.performItemClick(AdapterView.java:310)
at android.widget.AbsListView.performItemClick(AbsListView.java:1145)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3066)
at android.widget.AbsListView$3.run(AbsListView.java:3903)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.IllegalArgumentException: Unknown pattern character 'X'
at java.text.SimpleDateFormat.validatePatternCharacter(SimpleDateFormat.java:323)
at java.text.SimpleDateFormat.validatePattern(SimpleDateFormat.java:312)
at java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:365)
at java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:258)
at com.salesrabbit.android.util.DateUtils.<clinit>(DateUtils.java:31)
众所周知 - 当Java无法创建类实例时,会抛出异常 - exceptioninitializerError-通常表示构造函数中的错误,但也可以来自类的静态块。
示例(由于静态块而无法创建此类,您会看到错误):
class MyClass {
private static boolean canDivideByZero;
private Object unassignedValue;
static {
//Of course this code is ridiculous, it's just an example
canDivideByZero = (10/0 == 10);
}
public MyClass() {
//The stupid NPE here would also manifest as an ExceptionInInitializerError
if ( unassignedValue.equals("") ) {
...
}
}
}
尽管您尚未包含所需的堆栈跟踪您的评论给我们一个线索
这是奇怪的,如果我移动withtime()...然后代码有效,没有例外
因此,问题可能是您的公用事业类不是即时的,或者,您所调用的方法中的某些内容被损坏了 - 您是从构造函数中调用的。请记住,公用事业类应该是最终的私人构造函数,而私人构造师无助。
注意:在OP的特定示例中,试图从另一个SDK使用值的静态变量是原因。这是我在上面的示例中没有介绍的东西 - 静态块和静态变量都在加载时都初始化,并且可以抛出此例外。