2013-04-17 2 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; рейз Exception java.lang.NoSuchMethodError: java.sql.Connection.isValid(I)Z.

Примечание, который отличается только вещь JRE (бывший был 1,6, а новый 1,7)

+1

Приложение работает отлично в течение 3 лет и теперь сработает? Что-то должно было изменить библиотеку с кодом/системой/зависимой библиотекой – Apurv

+0

, вы изменили библиотеку jdbc MySQL? –

+1

Вы уверены, что ваша заявка использует 1.7, а не 1.5? Этот метод существует только с 1.6. –

ответ

0

Исправлено! И угадай что! A copy of old jre (1.5.08) был встроен в драйвер принтера HP, и адрес был добавлен в переменную окружения PATH!

+0

Вот почему я также использую jre только для одного проекта и запускаю его с помощью этого, а не с каким-либо системным дефолтом. Поздравляем, что вы нашли ЭТО ;-) – Sammy

5

Одд. Это ясно ссылается метод isValid(int) в java.sql.Connection

В вашем StackTrace я также вижу I и Z: java.sql.Connection.isValid(I)Z

Те соответствуют Int (I) и логическое (Z), точную сигнатуру метода в java.sql.Conneciton , Поэтому метод определенно называется. Примечание: символ справа от круглых скобок указывает тип возвращаемого метода, и этот метод возвращает boolean (Z).

Вот только идеи, которые я могу думать:

  1. Исходный код представлен не соответствует тому, что на самом деле работает в вашей среде. (Например, может быть, ваш «патч» является никогда не применяются?)

  2. Кроме того, среда может быть запущена Java 5, так как метод isValid(int) не показывает вплоть до Java 6.

1

К сожалению , Я не могу комментировать.

Вы только что заменили jvm и ни один из ваших классных файлов? Пожалуйста, попробуйте свои источники в среде IDE (не забудьте также заменить зависимости и т. Д.), Чтобы ваши источники были перекомпилированы и узнали о новых подписях, которые пришли с 1.7.

В остальном я иду с Юлием Дэвисом. Java должен вызывать isValid() (было бы интересно, что произойдет, если вы измените его на логическое имяOtherThanAMethodOfConnection = false;).

Смежные вопросы