java.lang.ClassCastException:java.lang.StackOverflowError无法强制转换为java.lang.Exception

时间:2013-08-23 13:11:10

标签: java selenium

实际上在执行我的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();
 }  }

因此,在执行上述代码时,它会将我抛出上面提到的错误消息

任何人都可以告诉我背后的原因

由于

实际Stacktrace:

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)

2 个答案:

答案 0 :(得分: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可能是代码转换为ThrowableException的一些代码 - 遗憾的是我们无法告诉哪里代码中没有代码堆栈跟踪。它甚至可能不是你的代码。

答案 1 :(得分:2)

我们无法解释您的代码导致该异常的情况。

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

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

  2. 该代码不包含类型转换,因此无法抛出ClassCastException

  3. 如果某些(真实)代码尝试将StackOverflowError强制转换为Exception,则会失败。 StackOverflowErrorError而非Exception的子类型。如果您需要同时处理ErrorException个对象,请使用常用的超类型 - Throwable


  4. 看起来Jon Skeet找到了原始StackOverflowError的根本原因,但对于我们(和你!)来说,从异常堆栈跟踪中发现它会更容易。