2013-12-20 83 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控制器的名稱。所以你必須指定包的正確名稱(如果控制器不在默認包中),後跟(。)和控制器名稱。

    相關問題