簡體   English   中英

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

[英]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.ConnectionisValid(int)方法

在你的堆棧跟蹤中,我也看到了一個I和一個Z: java.sql.Connection.isValid(I)Z

那些對應於int(I)和boolean(Z),這是java.sql.Conneciton方法的確切簽名。 所以一種方法肯定被稱為。 注意:括號右邊的字符表示方法的返回類型,此方法返回boolean(Z)。

以下是我能想到的唯一想法:

  1. 您提供的源代碼與您環境中實際運行的代碼不對應。 (例如,也許你的“補丁”從未真正應用過嗎?)

  2. 此外,您的環境可能正在運行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM