修复 JavaFx 应用程序启动方法中的异常

Rashmi Patidar 2023年10月12日
修复 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 的默认主题,一旦你启动应用程序就会启动。launchApplication 类中存在的静态方法,并从 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,这是一种运行时异常。并通过提供文件可以定位的绝对路径来处理。堆栈跟踪通常显示问题开始填充的行号。在负载参数中给出的目标必须是正确的。

因此,问题的给定解决方案如下。

  1. 给出文件所在位置的绝对路径。
  2. 将 SonarLint 插件添加到集成开发环境中,以帮助评估或处理写入时的异常。
作者: Rashmi Patidar
Rashmi Patidar avatar Rashmi Patidar avatar

Rashmi is a professional Software Developer with hands on over varied tech stack. She has been working on Java, Springboot, Microservices, Typescript, MySQL, Graphql and more. She loves to spread knowledge via her writings. She is keen taking up new things and adopt in her career.

LinkedIn

相关文章 - Java Error