com.sun.jdi.InvocationException стався метод виклику


75

Я просто хочу створити об'єкт класу, але отримав цю помилку під час налагодження. Хто-небудь може сказати мені, в чому проблема? Розташування цього коду знаходиться в якомусь класі обслуговування Spring (2.5).

Існує подібна проблема: співвідношення OJB Reference Descriptor 1: 0? Чи слід встановити для автоматичного отримання значення false?

Велике спасибі ~


3
Важко здогадатися, в чому проблема, без вихідного коду або трасування стека.
Джим Гаррісон,

8
Я зрозумів, метод toString () класу може викидати NullPointerException, якщо викликати, коли я виправляю, помилка зникла, але я не знаю, як це сталося?
xyy

3
Приємна робота xyz. Чи можете ви, будь ласка, опублікувати відповідь на питання самостійно, а потім прийняти цю відповідь, щоб ми могли закрити це питання? Крім того, вам потрібно прийняти відповіді на попередні запитання, якщо вони вирішують вашу проблему.
Зекас,

Відповіді:


90

Основна причина полягає в тому, що під час налагодження інтерфейсу налагодження Java буде викликати toString () вашого класу, щоб відобразити інформацію про клас у спливаючому вікні, тому, якщо метод toString визначений неправильно, це може статися.


1
Що робити, якщо метод toString взагалі не визначений? Я отримую його в класі RestTemplate банки Spring, це один з основних класів, і він не має методу toString (). Проте я отримую цей виняток з іншого класу, де я викликаю RestTemplate.getForObject (). Я не знаю, що відбувається.
Saurabh Patil

1
@SaurabhPatil toStringзавжди визначається у міру розширення всіх об'єктів java.lang.Object. Однією з можливостей Spring є те, що квасоля, яку обробляють, проксі-орієнтована, якщо вона вводиться в одиночні продукти. Якщо toStringвикликається неправильний потік (наприклад, не пов'язаний із контекстом запиту), тоді проксі-сервер видасть виняток під час виклику toStringйого.
Мурка

29

У мене також був подібний виняток під час налагодження в Eclipse. Коли я наводив курсор на об’єкт, у спливаючому вікні відображалося com.sun.jdi.InvocationExceptionповідомлення. Першопричиною для мене був не toString()метод мого класу, а hashCode()метод. Це спричиняло a NullPointerException, яке спричинило com.sun.jdi.InvocationExceptionпояву під час налагодження. Після того, як я подбав про нульовий покажчик, все працювало, як очікувалося.


16

Ну, це може бути через кілька речей, про які згадували інші до і після. У моєму випадку проблема була однаковою, але причиною було щось інше.

У класі (A) у мене було кілька об'єктів, і одним з об'єктів був інший клас (B) з деякими іншими об'єктами. Під час процесу один із об'єктів (String) із класу B був нульовим, і тоді я спробував отримати доступ до цього об'єкта через батьківський клас (A).

Таким чином, консоль видасть виняток з нульовою точкою, але налагоджувач eclipse покаже вищезазначену помилку.

Сподіваюся, ви зможете зробити все, що залишилося.


1
це було корисно +1
mattyman

@novice Це та сама проблема, з якою я стикаюся. Як це виправити?
М

5

Для мене той самий виняток був створений, коли toString було визначено як таке:

@Override
public String toString() {
    return "ListElem [next=" + next + ", data=" + data + "]";
}

Де ListElemзв’язаний елемент списку, і я створив його ListElemяк такий:

private ListElem<Integer> cyclicLinkedList = new ListElem<>(3);
ListElem<Integer> cyclicObj = new ListElem<>(4);
...

cyclicLinkedList.setNext(new ListElem<Integer>(2)).setNext(cyclicObj)
    .setNext(new ListElem<Integer>(6)).setNext(new ListElem<Integer>(2)).setNext(cyclicObj);

Це фактично спричинило циклічний зв’язаний список, який неможливо надрукувати. Дякую за вказівник.


3

У мене колись було те саме питання. У моєму випадку метод toString () був погано створений. Щоб бути точнішим, статична кінцева змінна була включена до методу toString, коли розробниковій формі, моїй команді було призначено завдання очищення коду, та додавати toString (), hashCode () код та equals () до об’єктів домену, де це можливо. але в клас із-за перегляду, він включив остаточну статичну змінну, яка спричинила "com.sun.jdi.InvocationException", цей виняток було видно при налагодженні лише тоді, коли я навів курсор на об'єкт, який має виняток.


3

Я отримав подібний виняток у Eclipse. Це сталося через java.lang.StackOverflowErrorпомилку. Я мав перевизначений toString()метод у дочірньому класі, маючи JoinColumn, який повертав рядок за допомогою об'єкта parentclass, що призводило до циклічної залежності. Спробуйте видалити цей об’єкт toString(), і він спрацює.


Ідеально Дуже дякую.
Шубхем Ар'я,

2

Вимкнення кнопки / значка "Показати логічну структуру" у верхньому правому куті вікна змінних у налагоджувачі eclipse це вирішило, у моєму випадку.


2

тож у мене тут була така сама проблема. З’ясував, що екземпляр мого домену від’єднується від сеансу сплячого режиму. Раніше я isAttached()перевіряв і прикріплював домен за допомогоюd.attach()


2

Це була моя справа

Я мав сутність Студент , який , мають багато-до-одного відносин з іншим об'єктом класами (класи , які він вивчав).

Я хотів зберегти дані в іншій таблиці, яка мала зовнішні ключі як студентів, так і класів . На якому - то разі виконання, я приносив список з студентів за певних умов, і кожен студент матиме посилання на Classes класу.

Зразок коду: -

Iterator<Student> itr = studentId.iterator();
while (itr.hasNext()) 
{
    Student student = (Student) itr.next();
    MarksCardSiNoGen bo = new MarksCardSiNoGen();

    bo.setStudentId(student);

    Classes classBo = student.getClasses();

    bo.setClassId(classBo);
}

Тут ви можете переконатися, що я встановлюю як посилання студентів, так і класів на BO, який я хочу зберегти. Але під час налагодження, коли я перевіряв, student.getClasses()він показував цей виняток ( com.sun.jdi.InvocationException).

Проблема , яку я виявив, що, після завантаження в студентському списку , використовуючи HQL запит, я промивку і закриття на сесії . Коли я видалив це session.close();твердження, проблема була вирішена.

Сеанс був закритий, коли я нарешті зберег усі дані в таблиці ( MarksCardSiNoGen ).

Сподіваюся, це допомагає.


1

Я отримав, com.sun.jdi.InvocationException occurred invoking methodколи я ледаче завантажив поле сутності, яке використовувало додаткову конфігурацію бази даних ( Spring Boot з 2 конфігураціями бази даних - ліниве завантаження з другою конфігурацією не працює ). Тимчасовим рішенням було додати FetchType.EAGER.


1

Я зіткнувся з такою ж проблемою, оскільки використовував анотацію Lombok @Data, яка створювала методи toString та хеш-код у файлах класів, тому я видалив анотацію @Data та використав конкретну анотацію @Gettter @Setter, яка виправила мою проблему.

ми повинні використовувати @Data лише тоді, коли нам потрібні всі @ToString, @EqualsAndHashCode, @Getter на всіх полях і @Setter на всіх нефінальних полях, і @RequiredArgsConstructor.


0

Можуть бути дві причини, чому елемент не існує:

  1. Поганий xpath (// * [@ id'forgotQuote])
  2. Правильний xpath, але жодного елемента (// * [містить (text (), 'Цього тексту немає на сторінці')])

Чи отримаєте ви com.sun.jdi.InvocationException в будь-якому випадку, коли ви запускаєте Debug і наводите курсор миші на посилання на WeBElement (це з Selenium та Java) ???

Ми використовуємо наступне, але не можемо розрізнити, чи повертає значення false через поганий xpath або неіснуючий елемент (дійсний синтаксис xpath):

public static boolean isElementDisplayed(WebElement element) {
    boolean isDisplayed = false;

    try {
        isDisplayed = element.isDisplayed();
    } catch (NoSuchElementException e) {
        ;// No Worries
    }
    return isDisplayed;
}

0

Видалення hashCode()та equals()вирішення моєї проблеми. У моєму випадку я використовував хеш-код commons-lang Apache і дорівнює будівельникам для створення нестатичних класів вручну, тому компілятор не видавав жодних винятків. Але під час виконання це спричинило виняток виклику.


0

У моєму випадку це було через застаріле посилання на об’єкт. Я автоматизував свою програму за допомогою селену webdriver, тому я набираю щось у текстове поле, а потім переходить на іншу сторінку, тому, повертаючись на попередню сторінку, цей об’єкт стає застарілим. Отже, це спричинило виняток, я обробив це, знову ініціалізувавши елементи - PageFactory.initElements (драйвер, Test.class;


0

Я теж стикався з тією ж проблемою. У моєму випадку я вдарив java.util.UnknownFormatConversionException. Я зрозумів це лише після printStackTraceдзвінка. Я вирішив це, змінивши свій код, як показано нижче.

від:

StringBuilder sb = new StringBuilder();
sb.append("***** Test Details *****\n");
String.format("[Test: %1]", sb.toString());

до:

String.format("[Test: %s]", sb.toString());

-1

Я зіткнувся з тією ж проблемою одного разу. У моєму випадку це було через перевизначений equalsметод. Наставали одні цінності null.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.