【已解决】:java.sql.SQLException 问题

在这里插入图片描述

一、Bug描述

今天做项目开发的时候,发现了这个Bug,话不多说,直接定位Bug原理+解决!


java.sql.SQLException: 
java.lang.RuntimeException: java.sql.SQLException: Can not issue executeUpdate() for SELECTs
     at com.infuze.service.subscription.workflow.SyncSubscriptionTrackerWorkflow.executeProcess(SyncSubscriptionTrackerWorkflow.java:130)
     at com.infuze.service.workflow.WorkflowExecutor.execute(WorkflowExecutor.java:24)
     at com.infuze.service.subscription.xml.SubscriptionXmlService.syncTracker(SubscriptionXmlService.java:140)
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     at Caused by: java.sql.SQLException: Can not issue executeUpdate() for SELECTs
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
     at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2373)

 

二、定位报错点

ps.executeUpdate(); //  problem is here

发现好问题的报错后,就可以解决了。

三、解决方案

ps.execute();  //代替ps.executeUpdate

四、注意事项及原理

Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute。

使用哪一个方法由 SQL 语句所产生的内容决定。

方法executeQuery用于产生单个结果集的语句,例如 SELECT 语句。 被使用最多的执行 SQL 语句的方法是 executeQuery。这个方法被用来执行 SELECT 语句,它几乎是使用最多的 SQL 语句。

方法executeUpdate:用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。

使用executeUpdate方法是因为在 createTableCoffees 中的 SQL 语句是 DDL (数据定义语言)语句。创建表,改变表,删除表都是 DDL 语句的例子,要用 executeUpdate 方法来执行。你也可以从它的名字里看出,方法 executeUpdate 也被用于执行更新表 SQL 语句。实际上,相对于创建表来说,executeUpdate 用于更新表的时间更多,因为表只需要创建一次,但经常被更新。

方法execute用于执行返回多个结果集、多个更新计数或二者组合的语句。

execute方法应该仅在语句能返回多个ResultSet对象、多个更新计数或ResultSet对象与更新计数的组合时使用。当执行某个已存储过程 或动态执行未知 SQL 字符串(即应用程序程序员在编译时未知)时,有可能出现多个结果的情况,尽管这种情况很少见。

因为方法 execute 处理非常规情况,所以获取其结果需要一些特殊处理并不足为怪。例如,假定已知某个过程返回两个结果集,则在使用方法 execute 执行该过程后,必须调用方法 getResultSet 获得第一个结果集,然后调用适当的 getXXX 方法获取其中的值。要获得第二个结果集,需要先调用 getMoreResults 方法,然后再调用 getResultSet 方法。如果已知某个过程返回两个更新计数,则首先调用方法getUpdateCount,然后调用 getMoreResults,并再次调用 getUpdateCount。

对于不知道返回内容,则情况更为复杂。如果结果是 ResultSet 对象,则方法 execute 返回 true;如果结果是 Java int,则返回 false。如果返回 int,则意味着结果是更新计数或执行的语句是 DDL 命令。在调用方法 execute 之后要做的第一件事情是调用 getResultSet 或 getUpdateCount。调用方法 getResultSet 可以获得两个或多个 ResultSet 对象中第一个对象;或调用方法 getUpdateCount 可以获得两个或多个更新计数中第一个更新计数的内容。

当 SQL 语句的结果不是结果集时,则方法 getResultSet 将返回 null。这可能意味着结果是一个更新计数或没有其它结果。在这种情况下,判断 null 真正含义的唯一方法是调用方法 getUpdateCount,它将返回一个整数。这个整数为调用语句所影响的行数;如果为 -1 则表示结果是结果集或没有结果。如果方法 getResultSet 已返回 null(表示结果不是 ResultSet 对象),则返回值 -1 表示没有其它结果。

总结:写在后面的话

Hello,各位看官老爷们好,洲洲已经建立了技术交流群,如果你很感兴趣,可以私信我加入我的社群。

📝社群中不定时会有很多活动,例如每周都会包邮免费送一些技术书籍及精美礼品、学习资料分享、大厂面经分享、技术讨论、行业大佬创业杂谈等等。
📝社群方向很多,相关领域有Web全栈(前后端)、人工智能、机器学习、自媒体变现、前沿科技文章分享、论文精读等等。
📝不管你是多新手的小白,都欢迎你加入社群中讨论、聊天、分享,加速助力你成为下一个技术大佬!也随时欢迎您跟我沟通,一起交流,一起成长。变现、进步、技术、资料、项目、你想要的这里都会有
📝网络的风口只会越来越大,风浪越大,鱼越贵!欢迎您加入社群~一个人可以或许可以走的很快,但一群人将走的更远!
📝关注我的公众号(与CSDN同ID:程序员洲洲)可以获得一份Java 10万字面试宝典及相关资料!~

📝想都是问题,做都是答案!行动起来吧!欢迎评论区or后台与我沟通交流,也欢迎您点击下方的链接直接加入到我的交流社群!~ 跳转链接社区~

在这里插入图片描述

### 回答1: va.lang.RuntimeException是Java中的一个异常类,表示在程序运行时发生了一个未被捕获的异常。这种异常通常是由于程序中的错误或意外情况引起的,例如空指针引用、数组越界、除以零等。当程序遇到这种异常时,它会抛出RuntimeException并停止执行,除非程序中有相应的异常处理机制来捕获并处理该异常。因此,开发人员应该尽可能避免这种异常的发生,以确保程序的稳定性和可靠性。 ### 回答2: va.lang.RuntimeException是Java程序开发中常见的一种异常类型,并且它是一种非检查异常,表示在运行时期间出现了异常情况。当程序抛出Java.lang.RuntimeException异常时,通常会伴随着一些错误信息,例如“ java.lang.RuntimeException: Java Heap Space”。 Java Heap Space是一个与Java虚拟机有关的概念,它表示Java程序执行时可用的内存空间。当Java程序执行时,如果需要的内存超出了Java Heap Space的限制,就会抛出java.lang.RuntimeException运行时异常。 Java Heap Space异常的出现可能有多种原因。例如,程序中存在错误的内存管理实践、内存泄漏、存在过多的对象等。通常来说,可以通过增加Java Heap Space的大小或者优化代码来缓解这种异常。 当程序抛出Java.lang.RuntimeException异常时,程序就会中止,这种异常很难排查和处理,所以在程序开发中,我们应该尽可能避免使用RuntimeException类型的异常,而使用检查异常来保证程序的稳定性。 总之,Java.lang.RuntimeException是程序运行时遇到异常时的一种非检查异常类型,它通常是由于操作超出了Java Heap Space的限制所引起的。为了保证程序的稳定性,开发者应尽量避免使用RuntimeException类型的异常。 ### 回答3: va.lang.RuntimeException是Java编程中的一个重要异常类,在程序运行过程中如果出现了一些非正常的情况,Java虚拟机就会抛出RuntimeException异常,告诉程序员出现了问题。而“java.lang.RuntimeException: ja”这个异常信息是不完整的,实际上是缺少了一部分信息,需要根据具体情况进行分析,才能确定原因和解决方法。 通常,这个异常信息的意义是:在程序运行的过程中,发生了一些无法预料的错误,导致程序无法继续执行下去,从而抛出了RuntimeException异常。这个异常可能是由程序员的编码问题、程序的逻辑漏洞、系统资源不足或者运行环境不兼容等原因引起的。 针对这个异常,我们需要进行一些应急处理: 1.查看错误信息:首先需要查看程序运行过程中抛出的异常信息,寻找具体的错误原因,可以从日志中查看,或者调试程序获取更详细的信息。 2.检查代码错误:程序员需要检查代码是否存在逻辑错误、语法错误或者程序接口调用错误情况,以及是否进行了properException处理,从而解决代码错误引起的异常。 3.排除运行环境问题:如果程序在部署时出现了用户环境不兼容等问题,需要寻找解决方法,包括升级或更换运行环境。 4.优化系统资源:如果程序出现了系统资源不足的问题,需要优化程序或者增加系统资源,来确保程序正常运行。 总之,在程序运行过程中出现RuntimeException异常是很常见的,要想解决这个问题,要积极查找问题,找到问题的原因,再针对性地解决,从而保证程序的正常运行。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员洲洲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值