为什么 Apache NetBeans 空指针异常在我的 Java FXML 项目中给出错误?

问题描述 投票:0回答:1

当我在 netbeans 中创建一个新的 java FXML 项目时,通常会生成一个简单的代码,该代码执行时没有错误,但在我的情况下情况并非如此,一旦我创建项目并尝试执行它,它就不允许我执行并引发异常,奇怪的是我已经在 java fx 中创建了一个可以运行的项目,但我不知道为什么有些运行而另一些不运行。这是例外:

`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:907)
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:750)
Caused by: java.lang.NullPointerException: Location is required.
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3242)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3210)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3183)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3159)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3139)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3132)
at javafxapplication3.JavaFXApplication3.start(JavaFXApplication3.java:21)
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$4(WinApplication.java:185)
... 1 more
Exception running application javafxapplication3.JavaFXApplication3
C:\Users\EduardDev\Documents\NetBeansProjects\JavaFXApplication3\nbproject\build-impl.xml:1367: The      following error occurred while executing this line:
C:\Users\EduardDev\Documents\NetBeansProjects\JavaFXApplication3\nbproject\build-impl.xml:994: Java r eturned: 1
BUILD FAILED (total time: 1 second)`

This is how the packages are distributed, I have other projects where the files are like this and it runs me unlike the one that netbeans creates but it doesn't work either

这是主课

 package javafxapplication3;

import javafx.application.Application;
`import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

/**
 *
 * @author EduardDev
 */
public class JavaFXApplication3 extends Application {

@Override
public void start(Stage stage) throws Exception {
    Parent root = FXMLLoader.load(getClass().getResource("/view/FXML.fxml"));
    
    Scene scene = new Scene(root);
    
    stage.setScene(scene);
    stage.show();
    
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}

} ` 这是控制器

`package controller;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.Initializable;

/**
 * FXML Controller class
 *
 * @author EduardDev
 */
public class FXMLController implements Initializable {

/**
 * Initializes the controller class.
 */
@Override
public void initialize(URL url, ResourceBundle rb) {
    // TODO
}    

}`

这是 fxml 文件

` <?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1"          fx:controller="controller.FXMLController">

</AnchorPane>`
java javafx javafx-8 fxml
1个回答
0
投票

在您列出的所有源代码中,唯一相关的行是堆栈跟踪中代码的最后一行。那就是“javafxapplication3.JavaFXApplication3.start(JavaFXApplication3.java:21)”,换句话说,它是以下行:

Parent root = FXMLLoader.load(getClass().getResource("/view/FXML.fxml"));

因此,错误在于您将

null
传递给了
FXMLLoader.load()
,它需要一个非空参数。

所以,显然,

getClass().getResource("...")
返回了
null

所以,显然,你的输出目录中没有这样的资源。

造成这种情况的原因有很多:

  • 您的项目中没有类似
    /view/
    的内容
  • /view/
    目录与您的
    JavaFXApplication3
    类不在同一目录中
  • 您的构建系统未配置为包含
    *.fxml
    文件作为资源
  • 您的构建系统未配置为在子目录中查找它们
  • 您的构建系统不会将资源放在输出目录中的同一目录结构中。
  • 等等

我们需要查看您的构建脚本/定义文件才能确定这是错误的。

© www.soinside.com 2019 - 2024. All rights reserved.