2013-04-17 37 views
7

Tôi đã viết một ứng dụng, nó đã hoạt động tốt trong 3 năm, nhưng! ngày nay khi họ cố gắng để chạy ứng dụng này, một ngoại lệ bất ngờ huy động:Ngoại lệ Java không may: 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) 

mã của 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; 
} 

Tôi tự hỏi tại sao boolean isValid = false; tăng Exception java.lang.NoSuchMethodError: java.sql.Connection.isValid(I)Z.

Note rằng điều duy nhất khác là JRE (cựu là 1.6, và cái mới là 1.7)

+1

Đơn đăng ký hoạt động tốt trong 3 năm và hiện bị treo? Nội dung nào đó phải thay đổi mã/hệ thống/thư viện phụ thuộc – Apurv

+0

bạn có thay đổi thư viện jdbc của MySQL không? –

+1

Bạn có chắc chắn rằng ứng dụng của bạn đang sử dụng 1,7 và không 1.5 bằng cách nào đó? Phương pháp này chỉ tồn tại từ 1.6. –

Trả lời

0

Đã sửa lỗi !! Và đoán xem! A copy of old jre (1.5.08) đã được nhúng trong trình điều khiển Máy in HP và địa chỉ đã được thêm vào biến môi trường PATH!

+0

Đó là lý do tại sao tôi cũng sử dụng một jre cho chỉ một dự án duy nhất và bắt đầu nó với một này và không phải với bất kỳ loại hệ thống mặc định. Xin chúc mừng, bạn đã tìm thấy THAT ;-) – Sammy

5

Odd. Nó tham khảo rõ ràng phương pháp isValid(int) trong java.sql.Connection

Trong stacktrace của bạn tôi cũng thấy tôi và Z: java.sql.Connection.isValid(I)Z

Những tương ứng với int (I) và boolean (Z), chữ ký chính xác cho các phương pháp trong java.sql.Conneciton . Vì vậy, một phương pháp chắc chắn được gọi. Lưu ý: ký tự bên phải dấu ngoặc đơn cho biết kiểu trả về của phương thức, và phương thức này trả về boolean (Z).

Dưới đây là những ý tưởng duy nhất tôi có thể nghĩ đến:

  1. Mã nguồn bạn trình bày không tương ứng với những gì đang thực sự chạy trong môi trường của bạn. (Ví dụ, có lẽ bạn "vá" là bao giờ thực sự áp dụng không?)

  2. Ngoài ra, môi trường của bạn có thể chạy Java 5, kể từ khi phương pháp isValid(int) không hiển thị cho đến khi Java 6.

1

Xin lỗi , Tôi không thể bình luận.

Bạn vừa thay thế jvm và không có tệp lớp nào của bạn? Hãy thử các nguồn của bạn trong một IDE (nhớ để thay thế cũng phụ thuộc vv), để bạn nguồn được biên dịch lại và biết về chữ ký mới đi kèm với 1,7.

Đối với phần còn lại, tôi đi với Julius Davies. Java nên gọi isValid() (sẽ là thú vị, những gì sẽ xảy ra, nếu bạn thay đổi nó thành boolean nameOtherThanAMethodOfConnection = false;).

Các vấn đề liên quan