【问题标题】:How can EOFException be thrown when only SQLException is allowed?只允许 SQLException 时如何抛出 EOFException?
【发布时间】:2012-12-13 16:22:52
【问题描述】:

java.sql.Statement.execute 是否有可能抛出 java.io.EOFException?

http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#execute%28java.lang.String,%20int%29 中据说它可能只抛出 java.sql.SQLException。但是,我记录了这条异常消息:

** 开始嵌套异常 **

java.io.EOFException

堆栈跟踪:

java.io.EOFException
        在 com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1394)
        在 com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:1538)
        在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:1929)
        在 com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1167)
        在 com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1278)
        在 com.mysql.jdbc.MysqlIO.sqlQuery(MysqlIO.java:1224)
        在 com.mysql.jdbc.Connection.execSQL(Connection.java:2244)
        在 com.mysql.jdbc.Connection.execSQL(Connection.java:2192)
        在 com.mysql.jdbc.Statement.execute(Statement.java:906)
        在 com.mysql.jdbc.Statement.execute(Statement.java:947)
        在 sun.reflect.GeneratedMethodAccessor8.invoke(未知来源)
        在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        在 java.lang.reflect.Method.invoke(Method.java:597)
        在 org.logicalcobwebs.proxool.ProxyStatement.invoke(ProxyStatement.java:100)
        在 org.logicalcobwebs.proxool.ProxyStatement.intercept(ProxyStatement.java:57)
        在 $java.sql.Statement$$EnhancerByCGLIB$$4e952ca0.execute()
        在 handler.do_insert(handler.java:734)

在“handler.java”的第 733 行有“执行”调用,在第 734 行有对 getGeneratedKeys 的调用(也可能只抛出 SQLException)。

【问题讨论】:

  • 您可能遇到的情况是您的连接正在关闭。这不在 mySQL 的范围内,而是一个套接字问题。
  • 你的代码是否确实捕获了异常,因为它不仅仅是堆栈中更深的代码捕获异常的一些错误输出?
  • 对不起,代码确实捕获了异常。我很困惑;可能是因为堆栈跟踪(它在我的问题中被剪断)一直到主程序,所以我的印象是没有捕获到异常。

标签: java exception eofexception


【解决方案1】:

查看“BEGIN NESTED EXCEPTION”让我觉得 EOFException 嵌套在 SQLException 中 - 可能是这种情况吗?

该方法只能抛出一个SQLException,但SQLException异常可以包装另一个Exception(或Error)

【讨论】:

  • SQLException 的条件包括“如果发生数据库访问错误”。在这种情况下,我希望 SQLException 能够包装某种形式的 IOException。
【解决方案2】:

查找单词** BEGIN NESTED EXCEPTION **execute() 没有抛出这个异常,它是一个嵌套异常。这意味着在创建 SQLException 时已将其作为原因传递。像这样的:

try {

    ...

} catch (EOFException e) {
    throw new SQLException(e);
}

【讨论】:

  • 感谢您的解释和如何包装的示例!我的错误实际上是误读了日志并认为异常实际上没有被捕获(如 SQLException)。
猜你喜欢
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 2012-09-01
  • 2012-08-13
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
相关资源
最近更新 更多