实际上在执行我的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)
答案 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
可能是代码转换为Throwable
到Exception
的一些代码 - 遗憾的是我们无法告诉哪里代码中没有代码堆栈跟踪。它甚至可能不是你的代码。
答案 1 :(得分:2)
我们无法解释您的代码导致该异常的情况。
然而,有些事情是显而易见的:
这不是你真正的代码。您向我们展示的代码将无法编译。 (Test_A
是指未定义的driver
变量。
该代码不包含类型转换,因此无法抛出ClassCastException
。
如果某些(真实)代码尝试将StackOverflowError
强制转换为Exception
,则会失败。 StackOverflowError
是Error
而非Exception
的子类型。如果您需要同时处理Error
和Exception
个对象,请使用常用的超类型 - Throwable
。
看起来Jon Skeet找到了原始StackOverflowError
的根本原因,但对于我们(和你!)来说,从异常堆栈跟踪中发现它会更容易。