2013-04-17 60 views
7

我寫了一個應用程序,它工作正常3年,但!今天 當他們嘗試運行該應用程序,一個意外的異常引發:不幸的Java異常:java.lang.NoSuchMethodError

代碼
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

+0

你是否更改MySQL jdbc庫? –

+1

你確定你的應用程序使用1.7而不是1.5嗎?這種方法從1.6開始才存在。 –

回答

0

固定!!你猜怎麼着! A copy of old jre(1.5.08)嵌入在HP打印機驅動程序中,並且地址被添加到PATH環境變量!

+0

這就是爲什麼我只使用一個jre只是一個單一的項目,並啓動它與這一個,而不是任何類型的系統默認。恭喜,你發現了那個;-) – Sammy

5

奇。它清楚地引用在java.sql.Connection

isValid(int)方法在你的堆棧跟蹤我也看到我和Z:java.sql.Connection.isValid(I)Z

那些對應INT(I)和布爾(Z),在java.sql.Conneciton方法的準確簽名。所以一個方法肯定會被調用。注意:括號右邊的字符表示方法的返回類型,並且此方法返回布爾值(Z)。

這裏是我能想到的唯一的想法:

  1. 您呈現不對應於什麼在您的環境實際上運行的源代碼。 (例如,也許你的「補丁」是從來沒有真正應用 ?)

  2. 此外,您的環境可能是運行Java 5,因爲isValid(int)方法不顯示,直到Java的6

1

對不起,我無法評論。

你剛剛替換了jvm而沒有你的類文件嗎? 請在IDE中嘗試使用源代碼(記住要替換依賴項等),以便重新編譯源代碼並瞭解1.7中附帶的新簽名。

其餘的,我和Julius Davies一起去。 Java應該調用isValid()(如果將其更改爲布爾型nameOtherThanAMethodOfConnection = false;會很有趣,會發生什麼情況)。

相關問題