TextField空指针异常
我不知道这是否有帮助,但如果我运行此代码,我已经注释掉了setText行,它返回“指针ok”,这表明extCon.setStartValues指向正确的方法,尽管正如你所指出的那样,这是来自另一个实例,而不是我实际想要填充的实例。TextField空指针异常
package extrusion;
//import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
public class ExtrusionController {
\t
\t private double weight = 16.0;
\t private double rpm = 30.0;
\t private double time = 0.5;
\t @FXML
\t private TextField timeSecs;
\t @FXML
\t private TextField revsPerMin;
\t @FXML
\t private TextField sampleWeight;
// \t @FXML
// \t void 838383(ActionEvent event) {
//
// \t }
@FXML
public void setStartValues(){
\t System.out.println("pointer ok");
// \t sampleWeight.setText("" + weight);
// \t revsPerMin.setText("" + rpm);
// \t timeSecs.setText("" + time);
\t }
}
package extrusion;
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
public class ExtrusionApp extends Application {
\t
private AnchorPane extrusionForm;
\t private ExtrusionController extrusionController;
\t
\t public void start(Stage primaryStage) {
\t \t ExtrusionController extCon = new ExtrusionController();
\t \t primaryStage.setTitle("ColorMatrix Extrusion");
\t \t FXMLLoader loader = new FXMLLoader();
\t \t loader.setLocation(getClass().getResource("ExtrusionForm.fxml"));
\t \t try {
\t \t \t extrusionForm = loader.load();
\t \t \t extrusionController = loader.getController();
\t \t \t extCon.setStartValues();
\t \t } catch (IOException e) {
\t \t \t e.printStackTrace();
\t \t }
\t \t Scene scene = new Scene(extrusionForm);
\t \t primaryStage.setScene(scene);
\t \t primaryStage.show();
\t }
\t public static void main(String[] args) {
\t \t Application.launch(args);
\t }
}
感谢詹姆斯。这里是带有extCon的类注释掉,并用extruController.setStartValues()代替,它仍然给出一个空指针异常。但是,如果我运行我发布的原始代码,但在ExtrusionController类中注释掉三个setText语句,我不再获得空指针异常,代码似乎运行正常,但显然不填充TextFields。
package extrusion;
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
public class ExtrusionApp extends Application {
\t
private AnchorPane extrusionForm;
\t private ExtrusionController extrusionController;
\t
\t public void start(Stage primaryStage) {
\t \t //ExtrusionController extCon = new ExtrusionController();
\t \t primaryStage.setTitle("ColorMatrix Extrusion");
\t \t FXMLLoader loader = new FXMLLoader();
\t \t loader.setLocation(getClass().getResource("ExtrusionForm.fxml"));
\t \t try {
\t \t \t extrusionForm = loader.load();
\t \t \t extrusionController = loader.getController();
\t \t \t extrusionController.setStartValues();
\t \t } catch (IOException e) {
\t \t \t e.printStackTrace();
\t \t }
\t \t Scene scene = new Scene(extrusionForm);
\t \t primaryStage.setScene(scene);
\t \t primaryStage.show();
\t }
\t public static void main(String[] args) {
\t \t Application.launch(args);
\t }
}
Exception in Application start method
java.lang.reflect.InvocationTargetException
\t at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
\t at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
\t at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
\t at java.lang.reflect.Method.invoke(Method.java:498)
\t at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
\t at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
\t at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
\t at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
\t at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
\t at java.lang.reflect.Method.invoke(Method.java:498)
\t at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
\t at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
\t at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
\t at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
\t at extrusion.ExtrusionApp.start(ExtrusionApp.java:23)
\t at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
\t at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
\t at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
\t at java.security.AccessController.doPrivileged(Native Method)
\t at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
\t at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
\t at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
\t at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
\t ... 1 more
Exception running application extrusion.ExtrusionApp
我新的Java和我真的有一个空指针异常到TextField挣扎。我试图填充TextFields,所以当应用程序打开时,字段中已经有一些数据。我知道我在ExtrusionController中指向了正确的方法,因为我已经在该方法中尝试了一个System.out.println
命令,并且它显示ok。我认为这个问题可能与对TextFields的引用有关。在过去的几天里,我已经阅读了数十篇论坛帖子,但我正在围绕圈子。
package extrusion;
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
public class ExtrusionApp extends Application {
private AnchorPane extrusionForm;
private ExtrusionController extrusionController;
public void start(Stage primaryStage) {
ExtrusionController extCon = new ExtrusionController();
primaryStage.setTitle("ColorMatrix Extrusion");
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("ExtrusionForm.fxml"));
try {
extrusionForm = loader.load();
extrusionController = loader.getController();
extCon.setStartValues();
} catch (IOException e) {
e.printStackTrace();
}
Scene scene = new Scene(extrusionForm);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
}
package extrusion;
//import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
public class ExtrusionController {
private double weight = 16.0;
private double rpm = 30.0;
private double time = 0.5;
@FXML
private TextField timeSecs;
@FXML
private TextField revsPerMin;
@FXML
private TextField sampleWeight;
// @FXML
// void 838383(ActionEvent event) {
//
// }
@FXML
public void setStartValues(){
System.out.println();
sampleWeight.setText("" + weight);
revsPerMin.setText("" + rpm);
timeSecs.setText("" + time);
}
}
extCon
extrusionController
和含有2个不同控制器实例。当加载fxml和fxml中的对象被注入到这个实例时,使用extrusionController
。
但是,您将方法称为extCon
实例未与fxml一起使用,因此在域中包含null
值。
也谢谢Fabian,但正如我向Malte解释的那样,当我更改为extrusionContoller时。setStartValues我仍然得到一个空指针异常,但我甚至没有得到println,这表明它不再指向该方法。 –
尝试使用您从解析xml文件中获得的'extrusionController'变量,而不是您自己创建的'extCon'。如果不将其链接到任何布局xml文件,那么textfields将保留为null。 –
谢谢马尔特,但是当我改变到extrusionContoller.setStartValues时,我仍然得到一个空指针异常,但我甚至没有得到println,这将表明它不再指向该方法。 –
在问题中发布使用'extrusionController'的版本(完全除去'extCon')以及完整的堆栈跟踪。确定哪一行实际上引发异常。如果'loader.getController()'返回null,那么您可能还需要发布您的FXML文件。 –