【问题标题】:java.lang.NullPointerException is getting generating [duplicate]java.lang.NullPointerException 正在生成 [重复]
【发布时间】:2020-02-06 06:01:19
【问题描述】:

为什么会发生以下情况,我如何在EnglishHomepage 下使用它?

我的代码(不工作):

public class EnglishHomepage {

    WebDriver driver = null; 

    public Actions action = new Actions(driver);

    By login_button = By.xpath("//*[@id=\"wrapper\"]/div[1]/header/div[2]/div[1]/div/a[15]");


    //constructor of EnglishHomepage
    public EnglishHomepage (WebDriver driver) {

        this.driver = driver; 
    }

    public void clickFogotPassword() {
        driver.findElement(login_button ).click();
    }


    public void clickDropdownValue() {

        action.doubleClick(driver.findElement(xpath2)).perform();   

    }
}

代码(工作)

public class EnglishHomepage {

    WebDriver driver = null; 

    By login_button = By.xpath("//*[@id=\"wrapper\"]/div[1]/header/div[2]/div[1]/div/a[15]");


    //constructor of EnglishHomepage
    public EnglishHomepage (WebDriver driver) {

        this.driver = driver; 
    }

    public void clickFogotPassword() {
        driver.findElement(login_button ).click();
    }


    public void clickDropdownValue() {

        **Actions action = new Actions(driver);**
        action.doubleClick(driver.findElement(xpath2)).perform();   

    }
}

我可以在clickDropdownValue 方法下使用public Actions action = new Actions(driver);,并且测试按预期工作正常。

然而,

当我在班级下移动public Actions action = new Actions(driver); 时,可以看到java.lang.NullPointerException

异常

在 java.util.Objects.requireNonNull(Objects.java:203) 在 org.openqa.selenium.interactions.Actions.(Actions.java:65) 在 pages.EnglishHomepage.(EnglishHomepage.java:12) 在 testcases.Tc4_Market_status.click(Tc4_Market_status.java:27) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:133) 在 org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:584) 在 org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:172) 在 org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46) 在 org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:804) 在 org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:145) 在 org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146) 在 org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128) 在 java.util.ArrayList.forEach(ArrayList.java:1257) 在 org.testng.TestRunner.privateRun(TestRunner.java:770) 在 org.testng.TestRunner.run(TestRunner.java:591) 在 org.testng.SuiteRunner.runTest(SuiteRunner.java:402) 在 org.testng.SuiteRunner.runSequentially(SuiteRunner.java:396) 在 org.testng.SuiteRunner.privateRun(SuiteRunner.java:355) 在 org.testng.SuiteRunner.run(SuiteRunner.java:304) 在 org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53) 在 org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96) 在 org.testng.TestNG.runSuitesSequentially(TestNG.java:1180) 在 org.testng.TestNG.runSuitesLocally(TestNG.java:1102) 在 org.testng.TestNG.runSuites(TestNG.java:1032) 在 org.testng.TestNG.run(TestNG.java:1000) 在 org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115) 在 org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251) 在 org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)

【问题讨论】:

  • 请参考更新后的问题,我的意思是在英文主页下
  • 不初始化WebDriver driver = null;
  • @NagarjunaYalamanchili 是多余的,但不疼。

标签: java selenium


【解决方案1】:

如果new Actions(driver)位于构造函数的上方,则在构造函数体之前执行,即driver的值仍为null。

如果new Actions(driver)位于构造函数下方,则在构造函数体之后执行,即driver的值将是传递给构造函数的值。

建议:在字段初始化器中,永远不要使用在自己的初始化器中没有完全初始化的另一个字段,也不要使用后面声明的字段。

这样做的正确方法是在构造函数中也初始化字段,其中值可用。

WebDriver driver; // No need to initialize to null, it's the default

public Actions action; // Don't initialize here

public EnglishHomepage (WebDriver driver) {
    this.driver = driver; 
    this.action = new Actions(driver);
}

更新

实际上,根据 Java 语言规范的 12.5. Creation of New Class Instances 部分,将字段声明向下移动应该不起作用,该部分指定了这种初始化顺序(释义):

分配内存并调用构造函数,计算如下:

  • 如果此构造函数以this(...) 开头,则调用其他构造函数。使用这些相同的步骤递归地处理该构造函数调用。

  • 否则,调用 超类构造函数,或者使用 super(...) 语句指定,或者隐式调用无参数超类构造函数。

  • 执行该类的实例初始化器实例变量初始化器,将实例变量初始化器的值赋给对应的实例变量,在left-to -正确的顺序,它们以文本形式出现在类的源代码中。

  • 执行此构造函数的其余部分

可以看出,根据规范,构造函数主体(this(...)super(...) 除外)总是最后执行,因此将字段声明移到构造函数下方不应该改变 @初始化action字段时,987654331@字段为null

上面给出的建议是要走的路。

【讨论】:

    【解决方案2】:

    当您使用以下代码时。

    WebDriver driver; 
    
    public Actions action=new Actions(driver);
    

    它肯定会给出空指针异常,因为您已将驱动程序分配为空。 所以如果你想使用驱动程序,你可以使用下面的代码。

    WebDriver driver; 
    
    public Actions action;
    
    public EnglishHomepage (WebDriver driver) {
    
        this.driver = driver; 
        this.action = new Actions(this.driver); // now driver is initialized so it will not give null pointer exception. always assign value under constructor. when you are assigning value inline so current value is **null** 
    
    }
    

    【讨论】:

      猜你喜欢
      • 2015-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多