[英]Unfortunate Java Exception: java.lang.NoSuchMethodError
我写了一个应用程序,它工作了3年,但是! 今天,当他们尝试运行此应用程序时,出现了意外的异常:
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;
raise Exception java.lang.NoSuchMethodError: java.sql.Connection.isValid(I)Z
。
请注意 ,唯一不同的是JRE(前者是1.6,新的是1.7)
奇。 它显然引用了java.sql.Connection
的isValid(int)
方法
在你的堆栈跟踪中,我也看到了一个I和一个Z: java.sql.Connection.isValid(I)Z
那些对应于int(I)和boolean(Z),这是java.sql.Conneciton
方法的确切签名。 所以一种方法肯定被称为。 注意:括号右边的字符表示方法的返回类型,此方法返回boolean(Z)。
以下是我能想到的唯一想法:
您提供的源代码与您环境中实际运行的代码不对应。 (例如,也许你的“补丁”从未真正应用过吗?)
此外,您的环境可能正在运行Java 5,因为isValid(int)
方法直到Java 6才会显示。
对不起,我无法发表评论。
你刚刚更换了jvm而没有替换你的类文件吗? 请在IDE中尝试您的源代码(记住还要替换依赖项等),以便重新编译源代码并了解1.7附带的新签名。
其余的,我和朱利叶斯戴维斯一起去。 Java应该调用isValid()(会很有趣,如果将其更改为boolean nameOtherThanAMethodOfConnection = false,会发生什么)。
固定!! 你猜怎么着! 在HP打印机驱动程序中嵌入A copy of old jre
(1.5.08)的A copy of old jre
并且该地址已添加到PATH
环境变量中!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.