Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

JTable et StackOverflowError

3 réponses
Avatar
David Tran Quang Ty
Bonjour à tous,

Actuellement en train de développer une petite applet contenant un
JTable qui va chercher son contenu dans une base de données, j'ai
rencontré quelque problème. Après avoir dérivé la classe
AbstractTableModel, j'essaye d'initialiser une instance d'une autre
classe dérivée elle de JTable. À la compilation, tout fonctionne à
merveille, mais lors de l'exécution, je reçois inlassablement l'erreur
suivante : "Exception in thread "main" java.lang.StackOverflowError"
Après quelque recherche sur les archives et différents forum, il
semblerait que cela provienne d'un obscur problème de taille de
tableau... J'ai placé plus ou moins habilement des println afin de
savoir à partir de quel moment cela bloquait, et il semblerait que cela
soit quand j'appelle setModel();

Je vous joint une partie du code à tout hasard ;)

La classe dérivée de AbstractTableModel

class TableJeuxModel extends AbstractTableModel
{

private String[] header = new String[] {"N°", "Table", "Type",
"Limite", "Joueur", "Options"};
int nbElement, i;
protected Vector data;
protected Vector nomColonne;
connex conn1;

public TableJeuxModel() throws Exception
{

nomColonne = new Vector();
data = new Vector();
conn1 = new connex();

for (i=0 ; i<6 ; i++)
nomColonne.add(header[i]);

conn1.loadDriverAndConnect();

Statement instruction = null;
ResultSet resultat = null;

instruction = conn1.conn.createStatement();
resultat = instruction.executeQuery("SELECT * FROM partie");

while(resultat.next())
{
data.add(resultat.getString(1));
data.add(resultat.getString(2));
data.add(resultat.getString(3));
data.add(resultat.getString(4));
data.add(resultat.getString(5));
data.add(resultat.getString(6));
}

conn1.close();

System.out.println(nomColonne);
System.out.println(data);
}
[...]
}

Le reste étant une implémentation des méthodes à redéfinir tout ce qu'il
y a de plus classique

La classe dérivant JTable

class TableJeux extends JPanel
{
public TableJeux() throws Exception
{
JTable table;
TableJeuxModel model;

setLayout(new BorderLayout());


model = new TableJeuxModel();


System.out.println(model.nomColonne);
System.out.println(model.data);


table = new JTable();
System.out.println("test");
try{
table.setModel(model);
}
catch (Exception e) {
e.printStackTrace();
throw e;
}

System.out.println("test1");
table.createDefaultColumnsFromModel();
System.out.println("test2");
JScrollPane scrollpane = new JScrollPane(table);
System.out.println("test3");
add(scrollpane);
System.out.println("test0");
}
}


Et la classe qui contient le main est peut-être superflue à afficher
ici... Mais en tout cas, juste "test" apparaît, et lorsque je met
"table.setModel(model);" en commentaire, le programme s'exécute, mais le
tableau ne s'affiche logiquement pas ;)

Des idées ?

Merci d'avance ^^

3 réponses

Avatar
David Tran Quang Ty
Je me répond à moi-même, mais j'ai finalement opté pour une autre
solution qui m'a sorti de ce pétrin... Mais je suis tombé sur un autre os.
En fait, j'ai une erreur qui me semblait anodine, mais je n'arrive
malheureusement pas à m'en dépêtrer.

L'erreur est la suivante :
ListeTable.java:517: unreported exception java.lang.Exception; must be
caught or
declared to be thrown
throw e;
^

Elle est apparue à la base sur un appel à une méthode qui nécessitait de
gérer les exceptions, d'où le rajout de la séquence try.

Je joins ici une partie du code des deux fonctions incriminées, au cas ou ;)
(Mais c'est assez indigeste ^^")

La fonction ou l'erreur est détectée :

public void makeTableJeu() throws Exception
{

int i =0;
realData = new Vector();

try{
conn1 = new connex();
}

catch(Exception e)
{
System.err.println("n*** Exception caught in Load()");
throw e;
}

conn1.loadDriverAndConnect();

Statement instruction = null;
ResultSet resultat = null;

instruction = conn1.conn.createStatement();
resultat = instruction.executeQuery("SELECT COUNT(nom_partie) FROM
partie");

while(resultat.next())
{
nbElement = resultat.getInt(1);
}


System.out.println(nbElement);

instruction = conn1.conn.createStatement();
resultat = instruction.executeQuery("SELECT * FROM partie");

while(resultat.next())
{

String data = new String (resultat.getInt(1)+" - "+
resultat.getString(2)+" - "
+resultat.getString(3)+" - "
+resultat.getString(4)+" - "
+resultat.getString(5)+" - "
+resultat.getString(6));
realData.add(data);
i++;


}

conn1.close();

System.out.println(realData);

list = new JList(realData);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.setVisibleRowCount(-1);
list.addListSelectionListener(new ListSelectionListener()
{
public void valueChanged( ListSelectionEvent ee)
{
String str1 = (String)list.getSelectedValue();
StringTokenizer st = new StringTokenizer(str1);
String str = st.nextToken();

int tmp = Integer.parseInt(str);

try {
makeZone(tmp);
}
catch(Exception e)
{

System.err.println("n*** Exception caught in makeTableJeu");
throw e;

}

System.out.println(tmp);
System.out.println(list.getSelectedValue());
}
});

}


Et ici le code de la fonction appelée :

public void makeZone(int numPartie) throws Exception
{
JLabel partie[] = new JLabel[10];
Statement instruction = null;
ResultSet resultat = null;
String requete = "SELECT * FROM partie WHERE Id='"+numPartie+"'";

conn1 = new connex();
conn1.loadDriverAndConnect();

System.out.println(requete);

instruction = conn1.conn.createStatement();
resultat = instruction.executeQuery(requete);


while(resultat.next())
{
ajouterComposant(content, partie[0] = new
JLabel(resultat.getString(2)), 4, 1);
ajouterComposant(content, partie[1] = new
JLabel(resultat.getString(3)), 4, 2);
ajouterComposant(content, partie[2] = new
JLabel(resultat.getString(4)), 4, 3);
ajouterComposant(content, partie[3] = new
JLabel(resultat.getString(5)), 4, 4);
ajouterComposant(content, partie[4] = new
JLabel(resultat.getString(6)), 4, 5);
ajouterComposant(content, partie[5] = new
JLabel(resultat.getString(7)), 4, 6);
ajouterComposant(content, partie[6] = new
JLabel(resultat.getString(8)), 4, 7);
ajouterComposant(content, partie[7] = new
JLabel(resultat.getString(11)), 4, 8);
ajouterComposant(content, partie[8] = new
JLabel(resultat.getString(9)), 4, 9);
ajouterComposant(content, partie[9] = new
JLabel(resultat.getString(10)), 4, 10);
}

}

Merci d'avance aux éventuelles réponses, et merci à ceux qui avaient
commencé à réfléchir sur mon précédent problème ^^"
Avatar
Thomas Nguyen
On Sun, 30 Jan 2005 08:56:07 +0100, David Tran Quang Ty wrote:

Je me répond à moi-même, mais j'ai finalement opté pour une autre
solution qui m'a sorti de ce pétrin... Mais je suis tombé sur un autre os.
En fait, j'ai une erreur qui me semblait anodine, mais je n'arrive
malheureusement pas à m'en dépêtrer.

L'erreur est la suivante :
ListeTable.java:517: unreported exception java.lang.Exception; must be
caught or
declared to be thrown
throw e;
^

Elle est apparue à la base sur un appel à une méthode qui nécessitait de
gérer les exceptions, d'où le rajout de la séquence try.




J'ai isolé un bout de code, qui semble être à l'origine de ton problème.
Je suis pas sûr que ta ligne 517 corresponde bien à ce bout de code,
mais on va faire comme si.

list.addListSelectionListener(new ListSelectionListener()
{
public void valueChanged( ListSelectionEvent ee)
{
String str1 = (String)list.getSelectedValue();
StringTokenizer st = new StringTokenizer(str1);
String str = st.nextToken();

int tmp = Integer.parseInt(str);

try {
makeZone(tmp);
}
catch(Exception e)
{

System.err.println("n*** Exception caught in makeTableJeu");
throw e;

}

System.out.println(tmp);
System.out.println(list.getSelectedValue());
}
});

}




Ta fonction makeZone() lance une exception, et tu mets bien cet appel dans
un bloc try. Jusque là, tout va bien.

Le problème vient du fait que tu *relances* cette exception, alors que tu
es dans la méthode valueChanged().
Cette méthode est définie dans l'interface ListSelectionListener, et tu
ne peux pas ajouter de "throws Exception" à la signature de la méthode.

La seule solution est de ne pas relancer l'exception. Il faut que tu la
gères entièrement dans le bloc catch, sans la relancer.

Avatar
David Tran Quang Ty
J'ai isolé un bout de code, qui semble être à l'origine de ton problème.
Je suis pas sûr que ta ligne 517 corresponde bien à ce bout de code,
mais on va faire comme si.


Oui, cela correspondait bien ^^
Et merci pour le conseil, c'était bien d'ou venait l'erreur ^^