不幸的Java异常:java.lang.NoSuchMethodError

7

我写了一个应用程序,它在过去的三年中一直很好地运行着。但是今天当他们尝试运行此应用程序时,出现了一个意外的异常:

INFO   | jvm 1    | 2013/04/17 10:02:40 | Exception in thread "Thread-1" java.lang.NoSuchMethodError: java.sql.Connection.isValid(I)Z
INFO   | jvm 1    | 2013/04/17 10:02:40 |   at lib.MySQLConnectionPatch.SearchInCache(MySQLConnectionPatch.java:103)
INFO   | jvm 1    | 2013/04/17 10:02:40 |   at lib.MySQLConnectionPatch.getConnection(MySQLConnectionPatch.java:79)
INFO   | jvm 1    | 2013/04/17 10:02:40 |   at lib.SQLManager.establishSqlConnection(SQLManager.java:62)
INFO   | jvm 1    | 2013/04/17 10:02:40 |   at lib.SQLManager.establishSqlConnection(SQLManager.java:30)
INFO   | jvm 1    | 2013/04/17 10:02:40 |   at lib.tasks.classes.sql.executeQuery.execute(executeQuery.java:49)
INFO   | jvm 1    | 2013/04/17 10:02:40 |   at Components.TTask.run(TTask.java:86)
INFO   | jvm 1    | 2013/04/17 10:02:40 |   at Components.ThreadTask.run(ThreadTask.java:29)
INFO   | jvm 1    | 2013/04/17 10:02:40 |   at lib.tasks.classes.fori.execute(fori.java:66)
INFO   | jvm 1    | 2013/04/17 10:02:40 |   at Components.TTask.run(TTask.java:86)
INFO   | jvm 1    | 2013/04/17 10:02:40 |   at Components.ThreadTask.run(ThreadTask.java:29)
INFO   | jvm 1    | 2013/04/17 10:02:40 |   at lib.tasks.classes.fori.execute(fori.java:66)
INFO   | jvm 1    | 2013/04/17 10:02:40 |   at Components.TTask.run(TTask.java:86)
INFO   | jvm 1    | 2013/04/17 10:02:40 |   at Components.ThreadTask.run(ThreadTask.java:29)
INFO   | jvm 1    | 2013/04/17 10:02:40 |   at Components.ThreadTask.run(ThreadTask.java:44)
INFO   | jvm 1    | 2013/04/17 10:02:40 |   at LauncherService.LaunchService.run(LaunchService.java:38)

MySQLConnectionPatch.java/SearchInCache的代码如下:

private Connection SearchInCache(String key) {

    Connection result = null;
    try{
        if (!connections.isEmpty())
            result  = connections.get(key);
    } catch (Exception ex){
    }
    if (result != null){
        boolean isValid = false;  /** THIS IS LINE 103 WHERE EXCEPTION RAISED **/
        try {
            Statement s = result.createStatement();
            if (s.execute("SHOW STATUS;")){
                isValid = true;
            }
            s.close();
        } catch (Exception ex) {
            isValid = false;
        }

        if (!isValid){
            connections.remove(key);
            messageLog.stdwar("MySQL_PATCH: ONE CONNECTION EXPIRED :: force close");
            try {
                result.close();
            } catch (SQLException ex) {
                messageLog.stderr("MySQL_PATCH: CLOSING CONNECTION ERROR: "+ex.getMessage());
            }
            result = null;
        }
    }
    return result;
}

我想知道为什么 boolean isValid = false; 会引发异常 java.lang.NoSuchMethodError: java.sql.Connection.isValid(I)Z

注意,唯一不同的是 JRE 版本(之前是1.6,现在是1.7)。


1
应用程序运行了3年,现在崩溃了?一定是代码/系统/依赖库发生了变化。 - Apurv
1
你确定你的应用程序是在使用1.7而不是以某种方式使用1.5吗?这个方法只存在于1.6之后的版本。 - Daniel Kaplan
2
永远不要让 catch 块为空!如果甚至抛出异常...你会意识到吗? - Juan Antonio Gomez Moriano
1
那么,如果isValid被移除了,一切都没问题了吗? - Thihara
1
尝试删除所有的*class文件,然后使用1.7编译器重新编译它们。 - Alex Turbin
显示剩余5条评论
3个回答

5
奇怪的是,它显然涉及到java.sql.Connection中的isValid(int)方法。
在您的堆栈跟踪中,我还看到了一个I和一个Z:java.sql.Connection.isValid(I)Z 它们对应于int(I)和boolean(Z),这是java.sql.Connection中该方法的确切签名。因此,一定会调用方法。注意:括号右边的字符表示方法的返回类型,而此方法返回布尔值(Z)。
这里是我能想到的唯一想法:
  1. 您呈现的源代码与实际运行的环境不符(例如,也许“patch”从未真正应用?)

  2. 另外,您的环境可能正在运行Java 5,因为isValid(int)方法在Java 6之前不存在。


1
抱歉,我无法发表评论。
您刚刚更换了jvm,但是没有替换您的类文件吗? 请在IDE中尝试使用您的源代码(记得同时替换依赖项等),以便重新编译您的源代码,并了解随1.7一起提供的新签名。
至于其他方面,我同意Julius Davies的观点。Java应该调用isValid()方法(如果将其更改为boolean nameOtherThanAMethodOfConnection = false;,会很有趣)。

0

问题已解决!你猜怎么着!旧版jre的副本(1.5.08)被嵌入了HP打印机驱动程序中,并将其地址添加到PATH环境变量中!


这就是为什么我也仅为一个项目使用jre,并且使用它来启动该项目,而不使用任何系统默认设置。恭喜你找到了那个;-) - Sammy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接