source de ClassCastException inconnue (en JTables)
-
13-09-2019 - |
Question
Je refactorisation actuellement une JTable
qui affiche une multitude de différents types de données. La raison principale de ce refactoring est qu'il ya quelques ClassCastExceptions
(l'auteur / ami qui a écrit le code est désactivé en pause), et je ne peux pas à trouver où ceux-ci sont originaires de. En raison du grand codebase, je suis à une perte à l'endroit où commencer. Est-ce que quelqu'un a des suggestions? Je me rends compte et présente mes excuses pour l'ambiguïté de cette question!
J'ai inclus la trace de la pile ci-dessous. Merci !!
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)
La solution
Cette erreur qui se produit dans BooleanRenderer
est parce qu'il attend que la valeur qui est du modèle est de type Boolean
de la table et tente de jeter à elle (la réponse de AKF a la ligne de code exacte où il se produit).
Je pense que d'abord il était prévu que le modèle retournerait des valeurs Boolean
pour la colonne donnée, mais à un moment donné, il est de retour des chaînes au lieu.
Par conséquent, je me concentrerais sur ce modèle est utilisé pour cette table (est-il un modèle personnalisé? Est-ce le modèle par défaut où il ajoute des valeurs à elle?) Et de voir où il peut être obtenir une chaîne au lieu d'un Boolean
.
Autres conseils
Probablement la table contient une case à cocher (lorsque le modèle de la colonne indique que la colonne contient type booléen) et le moteur de rendu tente de convertir le contenu en un booléen. Mais sans doute le contenu ne sont que des chaînes. La solution est de changer les données de la table ou de créer votre propre moteur de rendu.
Je pense que le problème vient de votre TableModel (jtable.getModel ()) Il a dit quelque part
(..)
public Class<?> getColumnClass(int column)
{
switch(column)
{
(...)
case XX: return Boolean.class;
}
}
mais la valeur de votre modèle dans cette colonne est une chaîne
public Object getValueAt(int row,int column)
{
(..)
switch(column)
{
(...)
case XX: return (a String);
}
}
Pour déboguer ce problème, vous voudrez peut-être envisager de mordre la balle et de mettre un point d'arrêt dans la JTable$BooleanRenderer.getTableCellRendererComponent()
sur la ligne qui fait la distribution
setSelected((value != null && ((Boolean)value).booleanValue()));
(de JTable.java 1.288 06/11/15
)
et vérifier le type de value
de classe. lorsque vous trouvez un String
, vous pouvez identifier la colonne incriminée et la ligne de votre modèle. Cela au moins vous donner un nouveau départ à identifier le problème.
Désolé de déterrer une vieille question, mais je suis tombé sur cette question moi-même et ce poste est venu dans une recherche, ce qui est ce que je suis tombé.
J'ai eu des tests de JUnits ne (et lancer effectivement des exceptions d'exécution) mais je continuais à courir ajouter / enlève sur ma JTable (dans le test JUnit) qui a mis l'application GUI dans un mauvais état, et je verrais le ClassCastException venir exactement comme Chris avait décrit.
Ainsi, la « solution » pour moi était de faire en sorte que tous les tests unitaires attrapent leurs exceptions et retour échec au lieu de procédure pour exécuter plusieurs tests unitaires.
J'ai eu le même problème, et la cause était exactement comme spécifié Avrom. Dans mon cas, j'avais le getValueAt
mis en œuvre comme:
@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
}
}
Le problème ici est que, est une ligne n'existe pas, une chaîne est renvoyée, pour chaque colonne. Toutefois, certaines de mes colonnes a le type de classe, Boolean, et par conséquent l'exception:
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)
La solution était tout simplement de changer la valeur de retour à:
return null;