2

实际上我在执行我的java程序时面临下面提到的错误

  Exception in thread "pool-1-thread-1" java.lang.ClassCastException: java.lang.StackOverflowError cannot be cast to java.lang.Exception

实际上,我有一个名为 Test_A 的 java 类,其中包含名为 Login() 和 Logout() 的以下方法,还有一个名为 Test_B 的 java 类,其中包含方法 VerifyValidUser()。

class Test_A {

  Test_B b = new Test_B();

  public void login()
  {
     driver.findElement(By.name("userName")).sendKeys(userName);
     driver.findElement(By.name("password")).sendKeys(password);
     driver.findElement(By.name("login")).click();

     b.verifyLoginValidUser();
  }   

  public void logout()
  {
     driver.findElement(By.linkText("SIGN-OFF")).click();
  }
}

class Test_B {

Test_A a = new Test_A()

 public void verifyLoginValidUser()
 {
    if(isElementPresent(By.linkText("SIGN-OFF"))) 
    {
    }
    a.logout();
 }  }

所以在执行上面的代码时,它会抛出我上面提到的错误消息

谁能告诉我背后的原因

谢谢

实际堆栈跟踪:

Exception in thread "pool-1-thread-1" java.lang.ClassCastException: java.lang.StackOverflowError cannot be cast to java.lang.Exception
    at supportlibraries.DriverScript.driveTestExecution(DriverScript.java:106)
    at allocator.ParallelRunner.invokeTestScript(ParallelRunner.java:60)
    at allocator.ParallelRunner.run(ParallelRunner.java:41)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
4

2 回答 2

6

那么堆栈溢出的原因很简单:

class Test_A {
  Test_B b = new Test_B();
}

class Test_B {
  Test_A a = new Test_A();
}

构造 的实例Test_A涉及构造 的实例Test_B,这涉及构造Test_A等的实例。您应该重新设计类以消除这种循环依赖。(有替代方案可以保留依赖关系,但添加参数化构造函数 - 虽然这些可以工作,但打破依赖关系将是一个更好的选择。)

ClassCastException可能是一些损坏的代码转换Throwable到- 不幸的是,如果没有堆栈跟踪,Exception我们无法判断那个损坏的代码在哪里。它甚至可能不是您的代码。

于 2013-08-23T13:16:54.043 回答
2

我们无法解释您的代码导致该异常的原因是什么。

然而,有些事情是显而易见的:

  1. 那不是你真正的代码。您向我们展示的代码不会编译。(Test_A指的driver是未定义的变量。

  2. 该代码不包含类型转换,因此它不可能抛出ClassCastException.

  3. 如果某些(真实)代码确实尝试将 a 强制转换为 a StackOverflowErrorException它将失败。 StackOverflowErrorErrornot的子类型Exception。如果您需要同时处理ErrorException对象,请使用它们共同的超类型 - Throwable


看起来 Jon Skeet 已经找到了原始StackOverflowError.

于 2013-08-23T13:21:19.337 回答