如何解决 java.lang.***Error [重复]

Posted

技术标签:

【中文标题】如何解决 java.lang.***Error [重复]【英文标题】:How to solve java.lang.***Error [duplicate] 【发布时间】:2012-06-26 21:59:39 【问题描述】:

这是我第一次收到此错误。 这段代码基本上得到了在特定日期售出的每件商品的总和。

有解决此问题的提示吗?谢谢。

       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.***Error
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)

【问题讨论】:

第一件事:不要使用 Vector。曾经!请改用 ArrayList。 您没有粘贴足够的堆栈跟踪来查看循环。 SOE 几乎总是无限递归的结果。奇怪的是,这里不是这种情况,解决方案将非常简单:向 JVM 传递一个增加堆栈大小的参数。 @Traroth,如果您需要在多线程环境中动态调整数组大小,请使用Vector 请记住,由于您拥有 SOE,因此引发错误的行绝对没有问题。这只是压垮骆驼的最后一根稻草。 @AlexLockwood Vector 是同步的,但这本身并不能使其成为线程安全的。这就是反对 Vector 的论点的症结所在:它在锁定上浪费时间,而几乎没有任何好处 【参考方案1】:

我不认为您包含的代码 sn-p 是问题所在。查看堆栈跟踪的底部,我看到 Statistic.java:37 显然多次调用自己。允许递归调用,但如果不加以控制,它们会导致堆栈溢出。看起来你有一个循环......

【讨论】:

【参考方案2】:

您确实应该从posinventory.Statistic.refreshTableDailyStat 发布代码,但我猜一下:在那个方法中,第36 行调用StatisticEngine.getDailyData;第 37 行以递归方式调用 refreshTableDailyStat -- 所以这是你的问题,Statistic.java,第 37 行。

【讨论】:

【参考方案3】:

删除 ::

查询中的字符串“+”,因为 JVM 使用字符串池,对于每种类型的字符串,它都会调用服务来检查该字符串是否存在。

改用字符串生成器。

删除 Vector 并将其替换为 ArrayList,正如 Steve 上面提到的,检查代码 sn-p 发生未知递归的位置。

【讨论】:

在这种情况下,使用 StringBuilder 没有区别。 String query = "SELECT itemcode, SUM(quantity) AS 'Total Sales Per Day' " + "FROM sales" + "WHERE real_pur_date = '" + date + "' " + "GROUP BY itemcode ";可以替换为 stringBuilder.. 你们两个都错了。即使使用 StringBuilder,这种类型的代码也会导致 SQL 注入攻击。相反,您应该使用PreparedStatement @SashiKant 在问题中添加字符串很好,StringBuilder 不会对其进行改进。 @LuiggiMendoza 当然应该使用 PreparedStatement 进行查询,我指的是字符串连接 vs StringBuilder。

以上是关于如何解决 java.lang.***Error [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java - 线程“主”java.lang.Error 中的异常:未解决的编译问题

如何解决 java.lang.NoClassDefFoundError: javax/annotation/Generated?

升级到JDK8,编译时发生 Error:java: java.lang.ExceptionInInitializerError

Druid出现DruidDataSource - recyle error - recyle error java.lang.InterruptedException: null异常排查与解决(示例代

不知道如何防止 java.lang.***Error

IDEA启动Tomcat时报java.lang.IllegalStateException: Error starting child