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

时间:2010-11-08 12:02:33

标签: java spring

我只是想创建一个类的对象,但在调试时遇到了这个错误。谁能告诉我这是什么问题?此代码的位置在一些Spring(2.5)Service类中。

存在类似的问题:OJB Reference Descriptor 1:0 relationship? Should I set auto-retrieve to false?

非常感谢〜

16 个答案:

答案 0 :(得分:81)

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

答案 1 :(得分:27)

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

答案 2 :(得分:12)

嗯,这可能是因为其他人之前和之后提到的一些事情。在我的情况下,问题是相同的,但原因是其他的。

在类(A)中,我有几个对象,一个对象是另一个类(B)和其他一些对象。在此过程中,B类中的一个对象(String)为null,然后我尝试通过父类(A)访问该对象。

因此,控制台将抛出 null point exception ,但eclipse调试器将显示上述错误。

我希望你能做剩下的事。

答案 3 :(得分: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);

这有效地导致了无法打印的循环链表。谢谢你的指针。

答案 4 :(得分:3)

我曾经遇到过同样的问题。在我的情况下,toString()方法被严重创建。准确地说,当我的团队的开发人员被分配了代码清理任务并且尽可能地将toString(),hashCode()代码和equals()方法添加到域对象时,toString方法中包含了静态最终变量。但由于过度关注它,他包括了最终的静态变量,导致了##; com.sun.jdi.InvocationException&#34;只有在我悬停在具有异常的对象上时,才会在调试时看到此异常。

答案 5 :(得分:2)

所以我在这里遇到了同样的问题。发现我的域实例与hibernate会话分离了。我使用isAttached()使用d.attach()

检查并附加了域名

答案 6 :(得分:1)

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

答案 7 :(得分:1)

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

  1. 错误的xpath(// * [@ id&#39; forgotQuote])
  2. 更正xpath但没有元素(// * [contains(text(),&#39;此文字不在页面中&#39;)])
  3. 在运行Debug并将鼠标悬停在对WeBElement的引用(使用Selenium和Java)上时,是否会得到com.sun.jdi.InvocationException ??? < / p>

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

    public static boolean isElementDisplayed(WebElement element) {
        boolean isDisplayed = false;
    
        try {
            isDisplayed = element.isDisplayed();
        } catch (NoSuchElementException e) {
            ;// No Worries
        }
        return isDisplayed;
    }
    

答案 8 :(得分:1)

这是我的案例

我有一个 BO 类的学生,其多对一映射到另一个 BO class 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);
}

在这里你可以看到,我设置了学生 Classes 对我要保存的 BO 的引用。但是在我检查student.getClasses()时进行调试时,它显示了此异常(com.sun.jdi.InvocationException)。

我发现的问题是,在使用 HQL 查询获取学生列表后,我正在刷新并且正在关闭 会话。当我删除session.close();语句时,问题就解决了。

当我最终将所有数据保存到表格中时,会话结束了( MarksCardSiNoGen )。

希望这有帮助。

答案 9 :(得分:1)

我在Eclipse中遇到了类似的异常。这是由于java.lang.StackOverflowError错误造成的。我在子类中覆盖toString()方法,使用JoinColumn,它使用parentclass的对象返回字符串,从而产生循环依赖。尝试从toString()中删除该对象,它会起作用。

答案 10 :(得分:0)

删除hashCode()equals()解决了我的问题。在我的例子中,我使用Apache的commons-lang哈希代码和等于构建器来手动创建非静态类,因此编译器没有抛出任何异常。但是在运行时它导致了调用异常。

答案 11 :(得分:0)

在我的情况下,这是由于对象引用变得陈旧。 我使用selenium webdriver自动化我的应用程序,所以我在文本框中键入内容然后导航到另一个页面,所以当我回到上一页时,该对象变得陈旧。 所以这导致了异常,我通过再次初始化元素来处理它 - PageFactory.initElements(driver,Test.class;

答案 12 :(得分:0)

当我使用辅助数据库配置(Spring Boot with 2 database configs - lazy loading with second config does not work)延迟加载实体字段时,我收到了com.sun.jdi.InvocationException occurred invoking method。临时解决方案是添加FetchType.EAGER

答案 13 :(得分:0)

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

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

答案 14 :(得分: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());

答案 15 :(得分:-1)

我曾遇到过同样的问题。在我的情况下,这是因为被覆盖的equals方法。一个值即将到来null