com.sun.jdi.InvocationException发生了调用方法


75

我只想创建一个类的对象,但是在调试时出现此错误。有人可以告诉我问题是什么吗?该代码的位置在某些Spring(2.5)Service类中。

还有一个类似的问题:OJB参考描述符1:0关系?我应该将自动检索设置为false吗?

非常感谢〜


3
没有任何源代码或堆栈跟踪,很难猜测您的问题是什么。
Jim Garrison 2010年

8
我弄清楚了,如果调用该类的toString()方法可能会抛出NullPointerException,当我对其进行纠正时,该错误消失了,但是我不知道这是怎么发生的?
xyy 2010年

3
做得好xyz。您可以自己发布问题的答案,然后接受该答案,以便我们结束此问题吗?另外,如果先前的问题可以解决您的问题,则您需要接受这些问题的答案。
Zecas

Answers:


90

根本原因是在调试Java调试接口时,将调用类的toString()在弹出框中显示类信息,因此,如果未正确定义toString方法,则可能会发生这种情况。


1
如果根本没有定义toString方法怎么办?我在Spring jar的RestTemplate类中得到它,这是核心类之一,并且它没有toString()方法。我仍然从另一个类中调用RestTemplate.getForObject()获得此异常。我不知道发生了什么事。
萨拉·帕蒂(Saurabh Patil),

1
@SaurabhPatiltoString始终定义为所有对象extend java.lang.Object。Spring的一种可能性是,如果将范围限定的bean注入单例,则将它们代理。如果toString在错误的线程上调用了该线程(例如未与请求上下文关联的线程),则代理在调用该线程时会引发异常toString
默卡

29

在Eclipse中进行调试时,我也遇到了类似的异常。当我将鼠标悬停在一个对象上时,弹出框会显示一条com.sun.jdi.InvocationException消息。对我而言,根本原因不是toString()班上的hashCode()方法,而是方法。它引起NullPointerException,导致com.sun.jdi.InvocationException出现在调试期间。一旦我照顾了空指针,一切都会按预期进行。


16

好吧,这可能是因为其他人之前和之后提到的几件事。就我而言,问题是相同的,但原因是其他原因。

在一个类(A)中,我有几个对象,而一个对象是另一个带有其他对象的类(B)。在此过程中,类B的对象(字符串)之一为空,然后我尝试通过父类(A)访问该对象。

因此,控制台将抛出空点异常,但是Eclipse调试器将显示上述错误。

希望您能完成剩下的工作。


1
这对+1很有帮助
mattyman

@novice这是我面临的同一问题。如何解决此问题?
Manjunath M,

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,该方法使用父类的对象返回字符串,导致循环依赖。尝试从中删除该对象toString(),它将起作用。


完善。非常感谢。
Shubham Arya

2

在我的情况下,在Eclipse调试器中禁用变量窗口右上角的“显示逻辑结构”按钮/图标可以解决该问题。


2

所以我在这里有同样的问题。发现我的域实例正从休眠会话中脱离。我曾经使用以下isAttached()方法检查并附加域d.attach()


2

这是我的情况

我有一个实体学生,它与另一个实体(他所学习的类)具有多对一的关系。

我想将数据保存到另一个表,其为具有外键的两个学生课程。在执行某些情况下,我把一个列表学生在某些条件下,每个学生都会有一个参考类。

示例代码:-

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()它显示了这个exception(com.sun.jdi.InvocationException)。

我发现的问题是,提取后学生使用列表HQL查询,我被冲洗关闭会话。当我删除该session.close();语句时,问题已解决。

当我最终将所有数据保存到表(MarksCardSiNoGen)中时,会话已关闭。

希望这可以帮助。



1

我遇到了同样的问题,因为我使用的是在类文件中创建toString和哈希码方法的Lombok @Data批注,因此我删除了@Data批注,并使用了特定的@Gettter @Setter批注来解决我的问题。

仅当在所有字段上都需要所有@ ToString,@ EqualsAndHashCode,@ Getter和在所有非最终字段上都使用@Setter以及@RequiredArgsConstructor时,才应使用@Data。


0

元素不存在可能有两个原因:

  1. 错误的xpath(// * [@ id'forgotQuote])
  2. 正确的xpath但没有元素(// * [包含(text(),'此文本不在页面中')])

在任何一种情况下,当您运行Debug并将鼠标悬停在对WeBElement的引用(带有Selenium和Java的引用)上时,都会得到com.sun.jdi.InvocationException吗????

我们使用以下内容,但无法区分由于错误的xpath或不存在的元素(有效的xpath语法)而返回false:

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

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

0

删除hashCode()equals()解决了我的问题。就我而言,我使用Apache的commons-lang哈希码和equals生成器手动创建非静态类,因此编译器不会引发任何异常。但是在运行时,它导致了调用异常。


0

就我而言,这是由于对象引用变得过时。我使用selenium webdriver自动化了我的应用程序,因此我在文本框中键入内容,然后导航到另一个页面,所以当我回到上一页时,该对象变旧了。所以这导致了异常,我通过再次初始化元素来处理它-PageFactory.initElements(driver,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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.