java - 通过 Selenium Java 运行 Cucumber 脚本时如何解决 java.lang.ExceptionInInitializerError 和 java.lang.NoClassDefFoundError

标签 java selenium selenium-webdriver webdriver cucumber-java

我有一个 cucumber 和 Selenium 测试,一直运行良好,但突然停止运行并出现以下错误。

1 Scenarios (1 failed)
14 Steps (14 skipped)
0m0.004s

    java.lang.ExceptionInInitializerError
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.picocontainer.injectors.AbstractInjector.newInstance(AbstractInjector.java:145)
        at org.picocontainer.injectors.ConstructorInjector$1.run(ConstructorInjector.java:342)
        at org.picocontainer.injectors.AbstractInjector$ThreadLocalCyclicDependencyGuard.observe(AbstractInjector.java:270)
        at org.picocontainer.injectors.ConstructorInjector.getComponentInstance(ConstructorInjector.java:364)
        at org.picocontainer.injectors.AbstractInjectionFactory$LifecycleAdapter.getComponentInstance(AbstractInjectionFactory.java:56)
        at org.picocontainer.behaviors.AbstractBehavior.getComponentInstance(AbstractBehavior.java:64)
        at org.picocontainer.behaviors.Stored.getComponentInstance(Stored.java:91)
        at org.picocontainer.DefaultPicoContainer.getInstance(DefaultPicoContainer.java:699)
        at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:647)
        at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:678)
        at cucumber.runtime.java.picocontainer.PicoFactory.getInstance(PicoFactory.java:40)
        at cucumber.runtime.java.JavaHookDefinition.execute(JavaHookDefinition.java:60)
        at cucumber.runtime.Runtime.runHookIfTagsMatch(Runtime.java:224)
        at cucumber.runtime.Runtime.runHooks(Runtime.java:212)
        at cucumber.runtime.Runtime.runBeforeHooks(Runtime.java:202)
        at cucumber.runtime.model.CucumberScenario.run(CucumberScenario.java:40)
        at cucumber.runtime.model.CucumberFeature.run(CucumberFeature.java:165)
        at cucumber.runtime.Runtime.run(Runtime.java:122)
        at cucumber.api.cli.Main.run(Main.java:36)
        at cucumber.api.cli.Main.main(Main.java:18)
    Caused by: java.lang.NullPointerException
        at com.optal.browsers.WebDriverFactory.createAndSetUpThreadedBrowser(WebDriverFactory.java:56)
        at com.optal.browsers.WebDriverFactory.create(WebDriverFactory.java:37)
        at com.optal.hooks.ScenarioHooks.<clinit>(ScenarioHooks.java:19)
        ... 24 more

    java.lang.NoClassDefFoundError: Could not initialize class com.optal.hooks.ScenarioHooks
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.picocontainer.injectors.AbstractInjector.newInstance(AbstractInjector.java:145)
        at org.picocontainer.injectors.ConstructorInjector$1.run(ConstructorInjector.java:342)
        at org.picocontainer.injectors.AbstractInjector$ThreadLocalCyclicDependencyGuard.observe(AbstractInjector.java:270)
        at org.picocontainer.injectors.ConstructorInjector.getComponentInstance(ConstructorInjector.java:364)
        at org.picocontainer.injectors.AbstractInjectionFactory$LifecycleAdapter.getComponentInstance(AbstractInjectionFactory.java:56)
        at org.picocontainer.behaviors.AbstractBehavior.getComponentInstance(AbstractBehavior.java:64)
        at org.picocontainer.behaviors.Stored.getComponentInstance(Stored.java:91)
        at org.picocontainer.DefaultPicoContainer.getInstance(DefaultPicoContainer.java:699)
        at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:647)
        at org.picocontainer.DefaultPicoContainer.getComponent(DefaultPicoContainer.java:678)
        at cucumber.runtime.java.picocontainer.PicoFactory.getInstance(PicoFactory.java:40)
        at cucumber.runtime.java.JavaHookDefinition.execute(JavaHookDefinition.java:60)
        at cucumber.runtime.Runtime.runHookIfTagsMatch(Runtime.java:224)
        at cucumber.runtime.Runtime.runHooks(Runtime.java:212)
        at cucumber.runtime.Runtime.runAfterHooks(Runtime.java:206)
        at cucumber.runtime.model.CucumberScenario.run(CucumberScenario.java:46)
        at cucumber.runtime.model.CucumberFeature.run(CucumberFeature.java:165)
        at cucumber.runtime.Runtime.run(Runtime.java:122)
        at cucumber.api.cli.Main.run(Main.java:36)
        at cucumber.api.cli.Main.main(Main.java:18)

Calling System.exit() ..................

Process finished with exit code 1

最佳答案

异常初始化错误

ExceptionInInitializerError抛出表示在计算静态初始值设定项或静态变量的初始值设定项期间发生异常。

ExceptionInInitializerError当 JVM 尝试加载新类时抛出。在类加载过程中,所有静态变量和静态初始值设定项都会被评估。静态初始化程序是一个用大括号括起来的 block ,除了关键字 static 之外,没有任何名称和返回类型。

静态初始值设定项的示例:

import java.util.UUID;

class Example {

     private static String ID = null;

     static {
      ID = UUID.randomUUID().toString();
     }
}

静态初始化器在类加载过程中仅计算一次。因此,静态变量或初始化器求值时抛出的异常会被包装到 ExceptionInInitializerError 中,以便 JVM 指示该类无法初始化和加载。

抛出ExceptionInInitializerError错误的示例如下:

public class Example {

     private static String message = null;
     private static String subMessage = null;

     public Example(String message) {
      Example.message = message;
     }

     static {
      /* Store the first 10 characters of the input message. */
      subMessage = message.substring(0, 10);
     }

     public String getSubMessage() {
      return subMessage;
     }

     public static void main(String[] args) {
      Example exampleClass = new Example("Test");
      System.out.println(exampleClass.getSubMessage());
     }
}

执行上面的代码片段,您将看到以下错误:

Exception in thread "main" java.lang.ExceptionInInitializerError
     Caused by: java.lang.NullPointerException
     at main.java.Example.<clinit>(Example.java:13)

您可以使用以下任一方法来提取有关底层实际异常的更多信息:

  • getException():返回导致创建此错误的静态初始化期间发生的异常。
  • getCause():返回导致抛出此错误的异常。
<小时/>

处理ExceptionInInitializerError

ExceptionInInitializerError 用作包装器,指示静态初始化 block 或静态变量值的计算中出现异常。因此,我们必须确保原始异常被修复,以便 JVM 能够成功加载我们的类。

<小时/>

片尾

您可以从静态初始化程序 block 中抛出未检查/运行时异常。但是,您不能允许检查的异常传播到静态 block 之外,因为无法在源中处理这些异常。

关于java - 通过 Selenium Java 运行 Cucumber 脚本时如何解决 java.lang.ExceptionInInitializerError 和 java.lang.NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55950121/

相关文章:

java - 通过 Method.invoke() 的静态方法调用给了我 NPE

java - 如何在 GWT 中解析大数据 (XML)

css - WebDriver Selenium:在某些元素之后需要在表中选择元素

java - 如何解决使用Mockito.any()时的困惑?

java - 为什么 Double.parseDouble(scan.next()) 比 scan.nextDouble() 快这么多?

java - 如何使用 Java 在 WebDriver 中调用外部 JavaScript

java - 在 Selenium Webdriver java 中切换到其他浏览器窗口后无法单击链接

javascript - Protractor 失败并显示 'angular never provided resumeBootstrap'

python - 索引错误 : list index out of range/AttributeError: 'list' object has no attribute 'get_attribute'

java - 如何通过 Selenium 将 Xcode 模拟器设置为以编程方式旋转到 iPhone/iPad 的横向