0

jodatime を使用するのはこれが初めてで、修正方法がわからないスタックオーバーフロー エラーが発生しました。sqlite レコードが作成されてから今日までの日を表示できるようにする必要がある Android アプリを作成しています。私が知る限り、jodatime 以外はすべて正常に動作しています。プロジェクトのビルド時にこのエラーが発生しました

[2010-08-10 02:08:50 - Grow Journal Beta] org/joda/time/DateTimeUtils.class を処理しています...
[2010-08-10 02:08:50 - Grow Journal Beta] org/joda/time/DateTimeZone$1.class を処理しています...
[2010-08-10 02:08:50 - Grow Journal Beta] 警告: 関連する EnclosingMethod 属性を持たない匿名内部クラスの InnerClasses 属性を無視します。(このクラスは、壊れたコンパイラによって生成された可能性があります。)
[2010-08-10 02:08:50 - Grow Journal Beta] org/joda/time/DateTimeZone$Stub.class を処理しています...

これはlogcatです:

08-13 22:12:11.823: エラー/AndroidRuntime(6537): キャッチされていないハンドラー: キャッチされていない例外が原因でスレッド メインが終了しました
08-13 22:12:11.893: エラー/AndroidRuntime (6537): java.lang.StackOverflowError
08-13 22:12:11.893: エラー/AndroidRuntime (6537): java.util.Hashtable.get (Hashtable.java:274) で
08-13 22:12:11.893: エラー/AndroidRuntime (6537): java.util.Properties.getProperty (Properties.java:177) で
08-13 22:12:11.893: エラー/AndroidRuntime (6537): java.lang.System.getProperty (System.java:440) で
08-13 22:12:11.893: エラー/AndroidRuntime (6537): java.lang.System.getProperty (System.java:412) で
08-13 22:12:11.893: エラー/AndroidRuntime (6537): org.joda.time.DateTimeZone.getDefault (DateTimeZone.java:132) で
08-13 22:12:11.893: エラー/AndroidRuntime (6537): org.joda.time.DateTimeZone.forID (DateTimeZone.java:190) で
08-13 22:12:11.893: エラー/AndroidRuntime (6537): org.joda.time.DateTimeZone.getDefault (DateTimeZone.java:132) で

少し調べた後、自分でjodatimeバイナリを再コンパイルする必要があるだけだと思います。私はEclipseを使用しており、新しいプロジェクトを作成し、jodatimeソースをインポートしました。コンパイルしようとすると、コンソールに次のように表示されます。

Usage: java org.joda.time.tz.ZoneInfoCompiler <options> <source files>

-src ソース ファイルを読み取る場所を指定します。 -dst 生成されたファイルを書き込む場所を指定します。

ここからどこへ行くべきかよくわかりません。どんな助けでも大歓迎です。御時間ありがとうございます。

オーバーフローからの StackTrace:

スレッド [メイン] (中断 (例外 StackOverflowError))   
    DateTimeZone.getDefault() 行: 147
    ISOChronology.getInstance() 行: 86    
    DateTimeUtils.getChronology(年代学) 行: 231   
    DateConverter(AbstractConverter).getChronology(Object, Chronology) 行: 82
    DateTime(BaseDateTime).(Object, Chronology) 行: 170
    DateTime.(オブジェクト) 行: 168   
    PlantsCursorAdapter.newView(コンテキスト、カーソル、ViewGroup) 行: 71    
    PlantsCursorAdapter(CursorAdapter).getView(int, View, ViewGroup) 行: 182  
    ListView(AbsListView).obtainView(int) 行: 1274    
    ListView.measureHeightOfChildren(int, int, int, int, int) 行: 1147    
    ListView.onMeasure(int, int) 行: 1060
    ListView(View).measure(int, int) 行: 7966
    TableLayout(ViewGroup).measureChildWithMargins(View, int, int, int, int) 行: 3077
    TableLayout(LinearLayout).measureChildBeforeLayout(View, int, int, int, int, int) 行: 888
    TableLayout.measureChildBeforeLayout(View, int, int, int, int, int) 行: 453   
    TableLayout(LinearLayout).measureVertical(int, int) 行: 350   
    TableLayout.measureVertical(int, int) 行: 465
    TableLayout.onMeasure(int, int) 行: 428   
    TableLayout(View).measure(int, int) 行: 7966  
    FrameLayout(ViewGroup).measureChildWithMargins(View, int, int, int, int) 行: 3077
    FrameLayout.onMeasure(int, int) 行: 245   
    FrameLayout(View).measure(int, int) 行: 7966  
    LinearLayout.measureVertical(int, int) 行: 464    
    LinearLayout.onMeasure(int, int) 行: 278  
    LinearLayout(View).measure(int, int) 行: 7966
    PhoneWindow$DecorView(ViewGroup).measureChildWithMargins(View, int, int, int, int) 行: 3077   
    PhoneWindow$DecorView(FrameLayout).onMeasure(int, int) 行: 245    
    PhoneWindow$DecorView(View).measure(int, int) 行: 7966    
    ViewRoot.performTraversals() 行: 767  
    ViewRoot.handleMessage(メッセージ) 行: 1650  
    ViewRoot(Handler).dispatchMessage(メッセージ) 行: 99
    Looper.loop() 行: 123
    ActivityThread.main(String[]) 行: 4595    
    Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) 行: 利用不可 [ネイティブメソッド]  
    Method.invoke(Object, Object...) 行: 521  
    ZygoteInit$MethodAndArgsCaller.run() 行: 860  
    ZygoteInit.main(String[]) 行: 618
    NativeStart.main(String[]) 行: 利用不可 [ネイティブメソッド]  

DateTimeZone.class ソースはこちら

4

3 に答える 3

2

問題のある再帰は明らかにDateTimeZone.getDefaultとの間DateTimeZone.forIDです。ただし、スタックの行番号は、ここに表示されているJodaのソースコードと一致していないようです。そして、そのコードでは、DateTimeZone.getDefault()メソッドはシステムプロパティを調べません...そのようなものは静的初期化子で発生します。

AndroidコードベースはJodaTimeの微調整バージョンを使用しているようです。

とにかく、呼び出しJodaTime.setDefault(...)は回避策のようです。また、「user.timezone」システムプロパティが設定されていることを確認してください。

(標準のJodaTimeを再コンパイル/使用することは正しい戦略ではないと思います。Androidの微調整...それらが何であれ...おそらく理由があります。)

編集

これを再検討すると、これは一部のプラットフォーム(Android、Google-Apps)のJodaTime1.6.1のバグであることがわかります。課題トラッカーは、JodaTime1.6.2で修正されたものとして表示します。

于 2010-08-14T04:55:57.237 に答える
0

私はちょうど同じ問題を抱えています.1.6バージョンですべてうまく動作するので、それはjoda-time 1.6.1のバグだと思います. joda-time バグ トラッカーにバグ レポートを投稿し、バージョン 1.6 を使用しています。

パウロ

于 2010-08-19T08:55:31.103 に答える
0

次のようなものを使用できないのはなぜですか:

SELECT julianday('now') - julianday('1776-07-04');  

あなたのクエリでは?

于 2010-08-14T17:51:32.880 に答える