繁体   English   中英

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

[英]How to address java.lang.ExceptionInInitializerError and java.lang.NoClassDefFoundError when running cucumber script through Selenium Java

我有一个黄瓜和硒测试,它一直运行良好,突然停止运行并出现以下错误。

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 尝试加载新类时会抛出ExceptionInInitializerError 在类加载过程中,正在评估所有静态变量和静态初始值设定项。 静态初始值设定项是用大括号括起来的块,除了关键字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用作包装器,以指示静态初始化程序块或静态变量值的评估中出现异常。 因此,我们必须确保原始异常被修复,以便 JVM 能够成功加载我们的类。


奥特罗

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

如果你使用的是 Mac M1 芯片和 room lib ,试试这个: 在项目级 build.gradle 中,在 allprojects 中添加以下配置:

allprojects {
repositories {
    // ...
}

// ADD THE FOLLOWING
configurations.all {
    resolutionStrategy {
        force 'org.xerial:sqlite-jdbc:3.34.0'
    }
}
}

参考: https : //stackoverflow.com/a/70232822/7048025

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM