AbstractMethodError при вызове Exception.printStackTrace

Внутри предложения catch я хочу напечатать трассировку исключения исключения:

try {
    ...
} catch (Exception exc) {
    exc.printStackTrace();
    ...
}

Но в некоторых случаях я не получаю трассировку стека и вместо этого увидите что-то вроде этого:

Exception in thread "pool-1-thread-2" java.lang.AbstractMethodError: java.lang.Exception.printStackTrace()V
    ...

Обычно это исключение должно возникать, если библиотека имеет не ту же версию во время выполнения, что и во время компиляции, но в этом случае я работаю с классом из библиотеки Java. printStackTrace реализован в Throwable, поэтому этот метод не может быть абстрактным в Exception или любом производном классе. Кроме того, эта ошибка AbstractMethodError не всегда выдается, иногда в этом конкретном предложении catch есть другие исключения (поток программы зависит от данных из файла и текущего времени, поэтому иногда случаются другие вещи, такие как ArrayIndexOutOfBoundsExceptions или IllegalStateExceptions, которые выбрасываются в моем собственном коде и этого я ожидал увидеть вместо странной ошибки).

Итак, вопрос: как может произойти эта конкретная ошибка AbstractMethodError?

PS: Я использую Eclipse Helios в Linux и использую JDK 1.6.0_24 в качестве среды выполнения для запуска моего приложения.

Изменить: Произошла опечатка (printStrackTrace), я ее исправил. Было просто вычеркнуто из головы и не имеет никакого отношения к моей проблеме. Это (или должно быть) автономным приложением, без веб-приложения, без приложения Eclipse RCP, просто старым простым Java-приложением (более или менее). Проблема действительно возникает и на другом компьютере - также с Eclipse Helios, также с Fedora Linux, но с JDK 1.6.0_21.

К моему удивлению, действительно удалось вызвать getClass (). GetName () (но ни один другой метод, который я не пробовал), исключение имеет тип java.lang.ArrayIndexOutOfBoundsException . Я просто попытался использовать OpenJDK 1.6.0 (потому что он уже установлен в моей системе) и получил разные результаты. Вместо выдачи AbstractMethodError , printStackTrace напечатал только пустую строку, а getMessage () вернул null (вместо выдачи ошибки). Поэтому я не знаю, где именно было сгенерировано исключение, потому что блок try-catch наверху иерархии перехватывает исключение только для того, чтобы изящно остановить часть приложения. Я могу поймать этот тип исключения в некоторых моментах, чтобы понять, откуда оно взялось. Но это не объясняет странного поведения самого исключения.

Edit 2: Наконец, я отследил проблему. Оказалось, что это исключение произошло со мной уже вчера на той же строке, но иногда само исключение ведет себя странно. Я вызываю get (int) в List (точнее: ArrayList , который был упакован с помощью Collections.unmodifiableList (List) ) с индексом -1 (то есть начальное значение, внутри цикла этот индекс должен быть изменен, но не по какой-либо причине). По крайней мере, теперь я знаю, где искать, чтобы исправить ArrayIndexOutOfBoundsException , но я до сих пор не понимаю, почему само исключение ведет себя странно.

Редактировать 3: Я пробовал Throwable.class. getMethod ("printStackTrace"). invoke (exc); вместо exc.printStackTrace (); и получил java.lang.NoSuchMethodError: java.lang.Throwable.printStackTrace () V вместо java.lang.AbstractMethodError . Я также пытался скомпилировать файлы java из оболочки, используя javac и jar (только из одной библиотеки, из которой исходит исключение, потому что было бы утомительно вручную скомпилировать все jar-файлы). Результат тот же. Если я сам выброшу исключение IndexArrayOutOfBoundsException в этой строке, трассировка стека будет напечатана нормально. Возможно, мне стоит надеяться, что эта проблема встречается очень редко и больше нигде не возникнет.

6
задан Peter 25 July 2011 в 08:08
поделиться