2012-06-25 2 views
2

C'est la première fois que j'ai cette erreur. Ce code obtient essentiellement la somme de chaque article vendu à une date particulière.Comment résoudre java.lang.StackOverflowError

Des conseils pour résoudre ce problème? Merci.

 Statement statement = connection.createStatement(); 
     String query = "SELECT itemcode, SUM(quantity) AS 'Total Sales Per Day' " 
       + "FROM sales " 
       + "WHERE real_pur_date = '" + date + "' " 
       + "GROUP BY itemcode "; 
     ResultSet rs = statement.executeQuery(query); // this line gets the error/exception 
     while(rs.next()){ 
      Vector row = new Vector(); 
      row.add(rs.getString("itemcode")); 
      row.add(rs.getInt("Total Sales Per Day")); 
      dailyData.add(row); 
     } 
     statement.close(); 
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError 
at com.mysql.jdbc.Util.handleNewInstance(Util.java:431) 
at com.mysql.jdbc.ResultSetImpl.getInstance(ResultSetImpl.java:383) 
at com.mysql.jdbc.MysqlIO.buildResultSetWithRows(MysqlIO.java:3140) 
at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:491) 
at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:3118) 
at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:2288) 
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2709) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2677) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2627) 
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1556) 
at posinventory.Controller.StatisticEngine.getDailyData(StatisticEngine.java:20) 
at posinventory.Statistic.refreshTableDailyStat(Statistic.java:36) 
at posinventory.Statistic.refreshTableDailyStat(Statistic.java:37) 
at posinventory.Statistic.refreshTableDailyStat(Statistic.java:37) 
at posinventory.Statistic.refreshTableDailyStat(Statistic.java:37) 
+3

Première chose: ne pas utiliser le vecteur. Déjà! Utilisez une ArrayList à la place. –

+1

Vous n'avez pas collé assez de stacktrace pour voir le cycle. SOE est presque toujours la conséquence d'une récursion infinie. Sur l'étrange chance que ce n'est pas le cas ici, la solution serait très simple: passer à la JVM un paramètre qui augmente la taille de la pile. –

+0

En outre, quelle est la valeur 'date' qui provoque le' StackOverflowError'? –

Répondre

4

Vous devriez vraiment poster le code de posinventory.Statistic.refreshTableDailyStat, mais je vais le deviner: dans cette méthode, la ligne 36 appelle StatisticEngine.getDailyData; ligne 37 appels refreshTableDailyStat récursivement - donc il ya votre problème, Statistic.java, ligne 37.

5

Je ne pense pas que le extrait de code que vous avez inclus est le problème. En regardant le bas de votre trace de pile, je vois que Statistic.java:37 s'appelle apparemment plusieurs fois. Les appels récursifs sont autorisés, mais ils entraînent un débordement de pile s'ils ne sont pas contrôlés. On dirait que vous avez une boucle ...

2

Retirez le ::

String « + » de la requête, comme la machine virtuelle Java utilise la mise en commun de chaîne, pour chaque type de chaîne qu'il appelle un service pour vérifier si cette chaîne est présent ou non.

Utilisez plutôt String Builder.

Supprimez le vecteur et remplacez-le par ArrayList, comme Steve l'a mentionné ci-dessus, vérifiez l'extrait de code où une récursion inconnue s'est produite.

+1

Dans ce cas, cela ne fait aucune différence d'utiliser un StringBuilder à la place. –

+0

Chaîne query = "SELECT itemcode, SUM (quantité) AS 'Ventes totales par jour'" + "FROM sales" + "WHERE real_pur_date = '" + date + "'" + "GROUP BY itemcode"; peut être remplacé par un stringbuilder .. –

+0

Mauvais deux. Même avec un StringBuilder, ce type de code conduit à des attaques par injection SQL. Au lieu de cela, vous devriez utiliser [PreparedStatement] (http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html) –

Questions connexes