2013-12-20 81 views
0

我在这段代码中得到NullPointerException。 我使用JavaFX 2.2,NetBeans IDE的7.3.1,Windows 8中,Java的1.7.0NullPointerException - JavaFX

public class SampleController implements Initializable { 
    @FXML 
    GridPane grid; 
    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     // TODO 
     for(int i=0;i<10;i++){ 
      for(int j=0;j<4;j++){ 
       AnchorPane tile = new AnchorPane(); 
       tile.setMaxSize(225, 225); 
       grid.add(tile, j, i); 
      } 
     } 
    } 
} 

-JavaFX 2.2

+0

请发布_full_堆栈跟踪。 –

回答

11

我的猜测是,你GridPane未初始化。例如,如果你在您的FXML文件中有一个不同的ID。

这可能是错误的原因,但我不能确定没有完整的代码。

此外,

你应该学会如何调试NullPointerException。它通常很简单。这里有一些东西让你开始:

  1. 阅读stack trace。 其第一行看起来像这样:

Exception in thread "main" java.lang.NullPointerException。如果你没有看到一个,或者它没有提供任何信息,请确保你没有发现你遇到的异常情况。

  • 了解什么是空,其中(堆栈跟踪自带的行号。)
  • 修复它(这通常意味着初始化一些未初始化的,如你的情况)
  • 你可能想查看如何调试一般的java程序(记录,在运行时通过你的代码等)。我已经写了一篇关于这个主题的短文(初学者)blog post

    +0

    @KEYSER good catch +1 – SpringLearner

    +1

    实际上,GridPane使用@FXML标记,这意味着它是由FXMLLoader创建的。解决这个问题的方法是确保FXML文件具有一个fx:id设置为“grid”的GridPane组件。还有可能Grid没有足够的行数和列数,但我不确定是否会抛出NPE – Alexandre

    +0

    @PeekaySwitch +1好点,我相应地更新了我的问题。对于OP:第一步仍然是调试你的程序。如果你的'GridPane'为空,你可能想看看FXML的具体问题,比如上面提到的有关ID的问题。 – keyser

    -2

    从fxml文件加载接口时,需要一些时间来初始化该fxml中的所有组件。如果你在初始化之前使用这些组件,那么它会给出一个NullPointerException。我个人在我的代码中为了摆脱这个问题所做的工作是等待平台加载并开始使用这些组件。如果你想去一个解决方案一样,遵循下面的代码,

    new Timer().schedule(new TimerTask() { 
          @Override 
          public void run() { 
           Platform.runLater(new Runnable() { 
            public void run() { 
             //run your code here 
            } 
    
           }); 
    
          } 
    
         }, 500); 
    
    0
    public class SampleController implements Initializable { 
    @FXML 
    GridPane grid = new GridPane(); 
    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
        // TODO 
        for(int i=0;i<10;i++){ 
         for(int j=0;j<4;j++){ 
          AnchorPane tile = new AnchorPane(); 
          tile.setMaxSize(225, 225); 
          grid.add(tile, j, i); 
         } 
        } 
    } 
    

    } 你必须初始化GridPane

    +0

    你为什么回答2年前已回答的问题? –

    0

    如果异常会导致在该行grid.add(tile, j, i);,这种手段GridPane grid未初始化。您可能尚未在.fxml的<GridPane ...>中添加fx:id属性。

    <GridPane>应该类似于<GridPane fx:id="grid" ... >

    0

    初始化 “GridPane网格;”通过将fx:id设置为“网格”或通过此处的代码将其添加到气味生成器中。

    0

    有几个原因会导致此问题。 1. GridPane具有@FXML标记,这意味着它应该使用fxml加载程序进行初始化,一个可能的原因是您没有在场景构建器中将栅格标识赋予GridPane。 2.另一个原因可能是错误地指定了FXML控制器的名称。所以你必须指定包的正确名称(如果控制器不在默认包中),后跟(。)和控制器名称。

    相关问题