8

エラーのスタック トレース (メイン スレッドでは発生しない) にメソッドが含まれていない場合、何が問題なのかを調べるためにどのような行動を取ることができますか? 問題の完全なトレース:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
    at java.util.Vector.elementAt(Unknown Source)
    at javax.swing.table.DefaultTableColumnModel.getColumn(Unknown Source)
    at javax.swing.plaf.basic.BasicTableHeaderUI.getHeaderRenderer(Unknown Source)
    at javax.swing.plaf.basic.BasicTableHeaderUI.getHeaderHeight(Unknown Source)
    at javax.swing.plaf.basic.BasicTableHeaderUI.createHeaderSize(Unknown Source)
    at javax.swing.plaf.basic.BasicTableHeaderUI.getPreferredSize(Unknown Source)
    at javax.swing.JComponent.getPreferredSize(Unknown Source)
    at javax.swing.ViewportLayout.preferredLayoutSize(Unknown Source)
    at java.awt.Container.preferredSize(Unknown Source)
    at java.awt.Container.getPreferredSize(Unknown Source)
    at javax.swing.JComponent.getPreferredSize(Unknown Source)
    at javax.swing.ScrollPaneLayout.layoutContainer(Unknown Source)
    at java.awt.Container.layout(Unknown Source)
    at java.awt.Container.doLayout(Unknown Source)
    at java.awt.Container.validateTree(Unknown Source)
    at java.awt.Container.validate(Unknown Source)
    at javax.swing.RepaintManager.validateInvalidComponents(Unknown Source)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

私は現在、SwingWorker を使用してバックグラウンドでプロセスを実行しようとしていました。このプロセスは、最後に JTable を新しいデータで更新します。このタスクに関連するすべてのコードは大きすぎてここに投稿できません。エラーの原因を絞り込む方法があるかどうか疑問に思っています。

4

5 に答える 5

6

スタックトレースにメソッドが含まれていない可能性がありますが、作成したオブジェクトが含まれていないわけではありません。この場合、問題はおそらくTableModel.

このようなスタック トレースをデバッグするには、通常、次のいずれかの方法を使用します。

  • これらの標準の JDK クラスをどこで使用しているかを考えてみてください。スタック トレースを見ると、何が問題なのかをかなりよく理解できます (スタック トレースしかないため、この質問に対する回答でわかるように)。
  • IDE に「例外ブレークポイント」を配置します。これにより、少なくともデバッガーを使用して、スタックトレースで利用可能な情報よりも多くの情報を取得できるようになります。独自のオブジェクトを認識しやすくなり、コードのどこに問題があるかを把握しやすくなる可能性があります
  • JDK ソース コードをプロジェクトにアタッチし、JDK ソース コードに通常のブレークポイントを配置して、デバッグを開始できるようにします。
  • 標準の JDK オブジェクトを使用する代わりに、通常の JDK クラスの匿名拡張などを作成し、問題のあるメソッドを呼び出すだけでオーバーライドしますsuper。これにより、問題のあるオブジェクトの問題のあるメソッドにブレークポイントを配置できます

これはすべて (最初のアプローチを除いて) 同じことになります。つまり、デバッガーを起動して、関連するすべてのオブジェクトをより注意深く調べて、何が問題なのかを理解できるようにします。問題を理解したら、ほとんどの場合、それを修正するのはかなり簡単です

于 2012-06-13T10:31:52.190 に答える
5

JTable (または新しいモデル) に列がないため、内部コードが を呼び出すと ArrayIndexOutOfBoundsException が発生しますDefaultTableColumnModel.getColumn

テーブルのサイズが 0 以外であることを確認してください。

于 2012-06-13T10:23:46.240 に答える
2

通常、この種のスタック トレース (Swing のレイアウト/ペイント中の NPE または IndexOutOfBounds、トレースの RepaintManager/Look&Feel クラスを参照) は、EDT (イベント ディスパッチ スレッド) で Swing コンポーネントを作成/変更していないことが原因です。これには、再描画を引き起こすイベントを発生させる TableModel などの Swing データ モデルの更新が含まれます。

詳細については、「java swing concurrency tutorial」で検索してください。

于 2012-06-13T14:16:08.763 に答える
0

@Vulcan が特定の問題を解決しました。

一般に、スタック トレースにメソッドが含まれていない場合は、以前にいじり、現在デーモン スレッドによって実行されているものを探します。たとえば、この場合、テーブルをいじり、描画時にメソッドをまったく使用せずに物事がうまくいきませんでした。

他に探すべきものは、構成ファイル、コマンドラインパラメーター、環境変数など、無効な構成パラメーターです。

つまり、あなたのメソッドがエラーを引き起こさなかった場合、それはそれが混乱する前に起こったことです。

もちろん、非常にまれなケースですが、バグが見つかる場合もあります。

于 2012-06-13T10:32:10.003 に答える
0

IDE を使用および構成して、java.* クラスをデバッグし、rt.jarトレースおよびこれらのクラスへのステップインを許可できます。次に、スタック トレースの上位メソッドにブレークポイントを配置し、エラーの原因となったビジュアル コンポーネントで何をしたかを調べます。

あるいは、スタック トレースを分析するだけで、問題に関するヒントを得ることができgetColumn()ます。インデックス0 >= 0は、予想される列数または実際に存在する列数に関する別のヒントを提供します。

一般に、根本原因を突き止めるには、コンポーネントの動作を深く理解する必要があります。

于 2012-06-13T10:35:10.077 に答える