2017-10-16 24 views
0

我不知道这是否有帮助,但如果我运行此代码,我已经注释掉了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); 
     } 
} 
+1

尝试使用您从解析xml文件中获得的'extrusionController'变量,而不是您自己创建的'extCon'。如果不将其链接到任何布局xml文件,那么textfields将保留为null。 –

+0

谢谢马尔特,但是当我改变到extrusionContoller.setStartValues时,我仍然得到一个空指针异常,但我甚至没有得到println,这将表明它不再指向该方法。 –

+0

在问题中发布使用'extrusionController'的版本(完全除去'extCon')以及完整的堆栈跟踪。确定哪一行实际上引发异常。如果'loader.getController()'返回null,那么您可能还需要发布您的FXML文件。 –

回答

1

extConextrusionController和含有2个不同控制器实例。当加载fxml和fxml中的对象被注入到这个实例时,使用extrusionController

但是,您将方法称为extCon实例未与fxml一起使用,因此在域中包含null值。

+0

也谢谢Fabian,但正如我向Malte解释的那样,当我更改为extrusionContoller时。setStartValues我仍然得到一个空指针异常,但我甚至没有得到println,这表明它不再指向该方法。 –