TextField空指针异常

时间:2017-10-16 14:46:41

标签: java javafx

我不知道这是否有帮助,但如果我运行此代码,我已经注释掉了setText行,它返回“指针ok”,这表明extCon.setStartValues指向正确的方法,尽管你指出这是另一个实例,而不是我真正想要填充的实例。

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("pointer ok");
//    	sampleWeight.setText("" + weight);
//    	revsPerMin.setText("" + rpm);
//    	timeSecs.setText("" + time);
    	}
}

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);
	}

}

谢谢詹姆斯。这是带有extCon注释掉的类,并用squeeController.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 {
	
    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();
			extrusionController.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);
	}

}

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:767)
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$155(LauncherImpl.java:182)
	at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
	at extrusion.ExtrusionApp.start(ExtrusionApp.java:23)
	at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
	at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
	at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
	at java.security.AccessController.doPrivileged(Native Method)
	at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(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$148(WinApplication.java:191)
	... 1 more
Exception running application extrusion.ExtrusionApp

我是Java的新手,我真的很挣扎着TextField的空指针异常。我正在尝试填充TextFields,因此当应用程序打开时,字段中已经存在一些数据。我知道我正在指向ExtrusionController中的正确方法,因为我在方法中尝试了System.out.println命令,它显示正常。我认为问题可能出在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);
        }
}

1 个答案:

答案 0 :(得分:1)

extConextrusionController包含2个不同的控制器实例。加载fxml时使用extrusionController,并将fxml中的对象注入此实例。

但是,您为setStartValues实例调用了extCon方法,该方法未与fxml一起使用,因此在字段中包含null个值。