2017-11-20 2 views
-2

이 코드는 불과 며칠 전부터 작동합니다. 이제 더 이상 안드로이드 버전 6.0에서 작동하지 않습니다. 버전 7.0 이상에서 작동합니다. 나는 withTime를 이동하면다른 메서드에서 DateTime.withTime()을 호출하면 exceptionInInitializerError가 발생하는 이유

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); 
} 

여기, 이상한 일이()과 같이 유틸리티 방법 대신 직접 호출 할 전화 :

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) 
+0

6.0의 오류는 무엇입니까? –

+0

그것은 ExceptionInInitializerError입니다. –

+4

stacktrace를 질문에 추가하십시오. 아마 새로운 DateTiime에 코드가 있습니다. –

답변

2

-있는 ExceptionInInitializerError은 자바 클래스의 인스턴스를 만드는 데 실패 할 때 발생합니다 - 그것은 일반적으로 생성자에서 오류를 표시뿐만 아니라 정적 블록에서 할 수 있습니다 클래스.

예 (이 클래스 때문에 정적 블록으로 만들 수 없습니다, 당신은 오류 볼 것이다) : 당신이 필요한 스택 귀하의 의견은 우리에게 단서를 제공 추적에 포함되지 않았지만

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("")) { 
      ... 
     } 
    } 

} 

여기

는 I)가 withTime을 (이동하면 ... 그런 코드가 작동, 예외 그래서 문제가 될 수 있습니다

를 발생하지, 이상한 일이 유틸리티 클래스가 인스턴스화 할 수 없거나 호출중인 메서드에서 무언가가 깨져서 생성자에서 호출하는 것입니다. 유틸리티 클래스는 실제로 아무것도하지 않는 개인 생성자를 사용하여 최종 결정해야한다는 것을 명심하십시오.


참고 : OP의 특정 예제에서는 다른 SDK의 값을 사용하려고하는 정적 변수가 원인이었습니다. 이것은 위의 예제에서 다루지 않은 것입니다. 정적 블록과 정적 변수는 모두 클래스가로드 될 때 초기화되고이 예외를 throw 할 수 있습니다.

+0

도움 주셔서 감사합니다. 문제는 DateUtil 클래스의 staticSimpleDateFormat 변수를 초기화하는 데있었습니다. 문제를 해결하기 위해이 새로운 SimpleDateFormat ((Build.VERSION.SDK_INT

+0

문제가 없습니다. 당신이 모르는 경우에 - 현상금을 수여 할 계획이라면 수동으로해야합니다. 답을 받아들이는 것과 별개입니다. 그렇지 않으면 곧 만료됩니다. –

+1

아 나는 그 사실을 몰랐습니다. 도와 주셔서 감사합니다. –

관련 문제