簡體   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