HOWTO · Java
修復 JavaFx 應用程式啟動方法中的異常
本文介紹如何修復 JavaFx 中的應用程式啟動錯誤 - 應用程式啟動方法中的異常。
本頁內容
JavaFX 是一個高度豐富的庫,其程式碼是用本地 Java 程式碼編寫的。該庫習慣於製作富 Internet 應用程式,通常稱為 RIA。
該庫是一組易於理解的介面和類,是 Java 虛擬機器或 JVM 的友好替代品。使用該庫編寫的程式碼可以跨多個平臺執行,如桌上型電腦、手機、電視等。
很久以前,圖形使用者介面是使用 Swing 模板構建的,但在 JavaFX 出現之後,人們可以輕鬆地依靠該語言來處理相同的問題。使用 JavaFx 構建的應用程式的滲透率為 76%。
應用程式啟動方法中的異常是在應用程式執行和編譯完成時發生的執行時錯誤。當應用程式在載入執行時變數或檔案時效率低下時,就會出現該狀態。處理不當會丟擲 NullPointerException、FileNotFound 型別的異常。
此外,SonarLint、程式設計錯誤檢測器 (PMD) 等外掛可以幫助在沒有實際程式執行的情況下提前識別執行時問題。
下面是一個示例,顯示 JavaFx 中的應用程式啟動方法中的異常錯誤。
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class ApplicationStart extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
Parent parent = FXMLLoader.load(getClass().getResource("AnyXML.fxml"));
Scene scene = new Scene(parent);
stage.setScene(scene);
stage.setTitle("First Swing Sample");
stage.show();
}
}
上面似乎在 JavaFx 中的原始碼在 ApplicationStart 類中有一個 main 方法。給定的類擴充套件了一個抽象的 Application 類,並且在 JavaFX 庫中特別可用。
它有一個名為 Caspein 的預設主題,一旦你啟動應用程式就會啟動。launch 是 Application 類中存在的靜態方法,並從 main 函式呼叫。它以可變引數或 varargs 作為其引數。如果多次呼叫啟動方法,它會丟擲 IllegalStateException。
Application 類有一個抽象方法,其實現必須存在於 ApplicationStart 類中。override 註釋表明該註釋下面的程式碼屬於父 Application 類。由註釋覆蓋進行的方法的實現存在於註釋下方。
start 方法是 JavaFX 應用程式的主要入口,因為 main 是 Java 應用程式的入口位置。main 方法在 Application 或主執行緒被初始化時首先被呼叫。
該函式將 Stage 作為引數。階段表示主要步驟或檢視,並在應用程式在小程式檢視器中啟動時載入。它還會丟擲與方法一起定義的異常。
該方法中的第一條語句是載入 XML 檔案。FXMLLoader 類從 XML 物件模型載入物件層次結構。它用於將 FXML 文件中的物件層次結構帶入 Parent 例項。它將引數作為指向 XML 文件層次結構所在位置的 URL。
結果儲存在一個 Parent 類例項中,該例項以圖形格式儲存子型別。JavaFX 庫中的 Scene 類是將所有資料儲存在圖形檢視中的容器單元。場景的背景由指定的屬性填充。Stage 類的例項被建立並且可以與其他屬性一起使用。
下面提到的是用於在瀏覽器上顯示場景的屬性。
setScene方法用於指定場景並與舞臺例項變數一起使用。setTitle函式用於設定瀏覽器上的場景標題。show函式用於填充舞臺上的場景。
以下是上述程式碼塊的輸出。
Exception in Application start method java.lang.reflect.InvocationTargetException at sun.reflect
.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl
.invoke(NativeMethodAccessorImpl.java : 62) at sun.reflect.DelegatingMethodAccessorImpl
.invoke(DelegatingMethodAccessorImpl.java : 43) at java.lang.reflect.Method
.invoke(Method.java : 498) at com.sun.javafx.application.LauncherImpl
.launchApplicationWithArgs(LauncherImpl.java : 389) at com.sun.javafx.application.LauncherImpl
.launchApplication(LauncherImpl.java : 328) at sun.reflect.NativeMethodAccessorImpl
.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl
.invoke(NativeMethodAccessorImpl.java : 62) at sun.reflect.DelegatingMethodAccessorImpl
.invoke(DelegatingMethodAccessorImpl.java : 43) at java.lang.reflect.Method
.invoke(Method.java : 498) at sun.launcher.LauncherHelper$FXHelper
.main(LauncherHelper.java : 873) Caused by
: java.lang.RuntimeException
: Exception in Application start method at com.sun.javafx.application.LauncherImpl
.launchApplication1(LauncherImpl.java : 917) at com.sun.javafx.application.LauncherImpl
.lambda$launchApplication$1(
LauncherImpl.java : 182) at java.lang.Thread.run(Thread.java : 748) Caused by
: java.lang.NullPointerException
: Location is required.at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java : 3207) at javafx.fxml
.FXMLLoader.loadImpl(FXMLLoader.java : 3175) at javafx.fxml.FXMLLoader
.loadImpl(
FXMLLoader.java : 3148) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java : 3124) at javafx
.fxml.FXMLLoader.loadImpl(FXMLLoader.java : 3104) at javafx.fxml.FXMLLoader
.load(FXMLLoader.java : 3097) at ApplicationStart.start(ApplicationStart.java : 15) at com.sun
.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java : 863) at com.sun
.javafx.application.PlatformImpl.lambda$runAndWait$7(PlatformImpl.java : 326) at com.sun.javafx
.application.PlatformImpl.lambda$null$5(PlatformImpl.java : 295) at java.security
.AccessController.doPrivileged(Native Method) at com.sun.javafx.application.PlatformImpl
.lambda$runLater$6(PlatformImpl.java : 294) at com.sun.glass.ui.InvokeLaterDispatcher$Future
.run(InvokeLaterDispatcher.java : 95) at com.sun.glass.ui.win.WinApplication
._runLoop(Native Method) at com.sun.glass.ui.win.WinApplication.lambda$null$3(
WinApplication.java : 177)... 1 more Exception running application ApplicationStart
在上面顯示的輸出中,問題出現在使用 FXMLLoader 類載入 XML 物件的引數位置,但它返回一個空值。簡單來說,getResource() 方法不會定位函式引數中提供的路徑。
因此,空值填充 NullPointerException,這是一種執行時異常。並通過提供檔案可以定位的絕對路徑來處理。堆疊跟蹤通常顯示問題開始填充的行號。在負載引數中給出的目標必須是正確的。
因此,問題的給定解決方案如下。
- 給出檔案所在位置的絕對路徑。
- 將 SonarLint 外掛新增到整合開發環境中,以幫助評估或處理寫入時的異常。