2013-04-17 7 views
7

मैंने एक आवेदन लिखा, यह 3 साल तक ठीक काम कर रहा था, लेकिन! आज जब वे इस आवेदन चलाने का प्रयास, एक अप्रत्याशित अपवाद उठाया:दुर्भाग्यपूर्ण जावा अपवाद: 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

नोट कि केवल एक चीज अलग है (पूर्व 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) एचपी प्रिंटर ड्राइवर में एम्बेड किया गया था और पता PATH पर्यावरण चर में जोड़ा गया था!

+0

यही कारण है कि मैं सिर्फ एक एकल प्रोजेक्ट के लिए एक जेरे का उपयोग करता हूं और इसे किसी के साथ शुरू करता हूं, न कि किसी भी प्रकार के सिस्टम-डिफॉल्ट के साथ। बधाई हो, कि आपने पाया कि ;-) – Sammy

5

अजीब JRE है। यह स्पष्ट रूप से java.sql.Connection

में isValid(int) विधि को संदर्भित है अपने स्टैकट्रेस में मैं भी एक मैं और एक जेड देखें: java.sql.Connection.isValid(I)Z

उन int के अनुरूप (आई) और बूलियन (जेड), java.sql.Conneciton में विधि के लिए सटीक हस्ताक्षर । तो एक विधि निश्चित रूप से बुलाया जा रहा है। नोट: कोष्ठक के दाईं ओर वाला वर्ण विधि के रिटर्न प्रकार को इंगित करता है, और यह विधि बूलियन (जेड) लौटाती है।

यहाँ केवल विचारों मैं के बारे में सोच सकते हैं:

  1. स्रोत कोड आप प्रस्तुत क्या वास्तव में अपने वातावरण में चल रहा है के अनुरूप नहीं है। (जैसे, हो सकता है आपके "पैच" वास्तव में लागू किया कभी नहीं है?)

  2. इसके अलावा, अपने पर्यावरण जावा 5 चल रहा हो सकता है, के बाद से isValid(int) विधि जावा 6. जब तक दिखाई नहीं करता

1

क्षमा करें , मैं टिप्पणी नहीं कर सकता।

क्या आपने बस जेवीएम और अपनी कक्षाओं में से कोई भी फाइल नहीं बदली? कृपया अपने स्रोतों को आईडीई में आज़माएं (निर्भरता आदि को प्रतिस्थापित करना याद रखें), ताकि आप स्रोतों को दोबारा तैयार कर सकें और 1.7 के साथ आए नए हस्ताक्षरों के बारे में जानें।

बाकी के लिए, मैं जूलियस डेविस के साथ जाता हूं। जावा को isValid() को कॉल करना चाहिए (दिलचस्प होगा, क्या होगा, अगर आप इसे बुलियन नाम में बदलते हैं OtherThanAMethodOfConnection = false;)।

संबंधित मुद्दे