[英]NPE when constructor is being called
我有以下java類(實現頁面對象模式)
package core.pageObjects;
import org.openqa.selenium.*;
public class ConsultaClientePorDocumento {
private WebDriver driver;
public ConsultaClientePorDocumento(WebDriver d){
this.driver = d;
}
public WebElement cancelarButton = driver.findElement(By.id("Cancelar"));
}
然后我嘗試在我的測試中使用它,如下所示:
import core.pageObjects.*;
ConsultaClientePorDocumento consultaCPD = new ConsultaClientePorDocumento(driver);
我收到以下錯誤:
java.lang.NullPointerException
at core.pageObjects.ConsultaClientePorDocumento.<init>(ConsultaClientePorDocumento.java:16)
我究竟做錯了什么?
字段在構造函數體之前初始化(除了對超類構造函數的任何顯式或隱式調用之外)。 這意味着當初始化cancelarButton
時,構造函數尚未初始化driver
; 它仍然具有默認值null
。
放置cancelarButton
在構造函數初始化代碼初始化后, driver
,以確保driver
它需要的初始化代碼之前被初始化cancelarButton
。
private WebDriver driver;
public ConsultaClientePorDocumento(WebDriver d){
this.driver = d;
this.cancelarButton = driver.findElement(By.id("Cancelar"));
}
public WebElement cancelarButton;
JLS,第12.5節 ,指定了這種行為:
在作為結果返回對新創建的對象的引用之前,處理指示的構造函數以使用以下過程初始化新對象:
將構造函數的參數分配給此構造函數調用的新創建的參數變量。
如果此構造函數以同一個類中的另一個構造函數的顯式構造函數調用(第8.8.7.1節)開頭(使用此方法),則使用這五個相同步驟計算參數並以遞歸方式處理該構造函數調用。 如果該構造函數調用突然完成,則此過程突然完成,原因相同; 否則,繼續步驟5。
此構造函數不以同一個類中的另一個構造函數的顯式構造函數調用開頭(使用此方法)。 如果此構造函數用於Object以外的類,則此構造函數將以超類構造函數的顯式或隱式調用開始(使用super)。 使用這五個相同的步驟評估參數並遞歸處理超類構造函數調用。 如果該構造函數調用突然完成,則此過程突然完成,原因相同。 否則,繼續執行步驟4。
為此類執行實例初始值設定項和實例變量初始值設定項,將實例變量初始值設定項的值按從左到右的順序分配給相應的實例變量,在這些順序中,它們以文本方式出現在類的源代碼中。 如果執行任何這些初始值設定項導致異常,則不會處理其他初始化程序,並且此過程會突然完成同樣的異常。 否則,繼續步驟5。
執行此構造函數的其余部分 。 如果執行突然完成,則此過程突然完成,原因相同。 否則,此過程正常完成。
我強調了最后一步,即執行構造函數的其余部分。
您正在嘗試在構造函數設置之前使用driver
。 將cancelarButton
的初始化移動到構造函數中:
public ConsultaClientePorDocumento(WebDriver d){
this.driver = d;
cancelarButton = driver.findElement(By.id("Cancelar"));
}
public WebElement cancelarButton;
字段在文件中的位置並不重要,它們將在調用構造函數之前進行全部計算。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.