ClassCastExceptionが未知のソース(JTables中)
-
13-09-2019 - |
質問
私は現在、異なるタイプのデータの多くを表示JTable
リファクタリングです。このリファクタリングのための主な理由は、そこにいくつかのClassCastExceptions
(コードを書いた著者/友人がお休みオフになっている)ということである、と私は、これらがから発信されている場所を見つけるように見えることはできません。大規模なコードベースに、私が開始する場所へと途方に暮れてよ。誰もが何か提案がありますか?私が実現し、この質問の曖昧さのために謝罪!
私は、以下のスタックトレースを用意しました。感謝!!
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean at javax.swing.JTable$BooleanRenderer.getTableCellRendererComponent(Unknown Source) at javax.swing.JTable.prepareRenderer(Unknown Source) at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source) at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source) at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source) at javax.swing.plaf.ComponentUI.update(Unknown Source) at javax.swing.JComponent.paintComponent(Unknown Source) at javax.swing.JComponent.paint(Unknown Source) at javax.swing.JComponent.paintToOffscreen(Unknown Source) at javax.swing.BufferStrategyPaintManager.paint(Unknown Source) at javax.swing.RepaintManager.paint(Unknown Source) at javax.swing.JComponent._paintImmediately(Unknown Source) at javax.swing.JComponent.paintImmediately(Unknown Source) at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source) at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source) at java.awt.event.InvocationEvent.dispatch(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)
解決
BooleanRenderer
であり、それは(AKFの答えは、それが発生したコードの正確な行を有する)にキャストしようとすることを期待しているので、 Boolean
で発生され、このエラーがあります。
私の推測では、最初はそれがモデルが特定の列についてBoolean
値を返しますが、1つの点で、それは代わりに文字列を返していることが予想されたということです。
そのため、私はこの特定のテーブルのために使用されているものをモデルに集中するだろう(それがカスタムモデルである?それはそれに値を追加されたデフォルトのモデルですか?)、それは代わりにBoolean
の文字列を取得することができる場所を参照してください。
他のヒント
おそらく(列モデルが列、ブール型含まれていることを述べている場合)の表は、チェックボックスを含み、レンダラーはブールにコンテンツを変換しようとします。しかし、おそらく内容は単なる文字列です。ソリューションは、テーブル内のデータを変更したり、独自のレンダラを作成することです。
私はこの問題は、あなたのTableModel(jtable.getModel())から来ていると思います それはどこかで言った。
(..)
public Class<?> getColumnClass(int column)
{
switch(column)
{
(...)
case XX: return Boolean.class;
}
}
が、このコラムでは、モデルの値はStringです。
public Object getValueAt(int row,int column)
{
(..)
switch(column)
{
(...)
case XX: return (a String);
}
}
この問題をデバッグするには、弾丸をかむとキャストを作るラインでJTable$BooleanRenderer.getTableCellRendererComponent()
にブレークポイントを置くことを検討する必要があります。
setSelected((value != null && ((Boolean)value).booleanValue()));
(JTable.java 1.288 06/11/15
から)
とvalue
のクラスの種類を確認。あなたがString
を見つけたとき、あなたはあなたのモデルから問題の列と行を識別することができます。それは、少なくともあなたの問題を特定する上でスタートを与えるだろう。
古い質問を掘るために申し訳ありませんが、私はこの問題に自分自身を走っ&この記事が検索に上がってきた、これは私がに走ったものです。
私はJUnitsのテストが失敗(と、実際に実行時例外をスロー)だったが、私は追加走り続け/悪い状態でGUIアプリケーションを入れて、私のJTable(JUnitテスト中)で除去し、そして私はClassCastExceptionがが出てくる見ますクリスは説明したとおりに。
私のために、「修正」ので、より多くのユニットテストを実行するための手続きのすべてのユニットテストは、その例外をキャッチしてのではなくの失敗を返すことを確認しました。
私は同じ問題を抱えていた、とAvromが指定されている原因は正確でした。私の場合、私はgetValueAt
として実装されていた。
@Override
synchronized public Object getValueAt(int row, int col) {
if (row < m_rows.size()) {
return m_rows.get(row).getValueAt(col);
}
else
{
return ""; // THIS IS THE BUG
}
}
ここでの問題は、文字列は、列ごとに、返される行が存在しないということです。しかし、私のコラムの一部はクラス型、ブール、ひいては例外があります:
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
at javax.swing.JTable$BooleanRenderer.getTableCellRendererComponent(JTable.java:5409)
at javax.swing.JTable.prepareRenderer(JTable.java:5736)
ソリューションへの戻り値を変更するだけでした
return null;