2016-05-16 9 views
1

私は、fxmlをロードするウィンドウのコントローラクラスのインスタンスにアクセスしようとしています。エラーなしで読み込みますが、使用するアカウント数を印刷しようとすると、nullポインタ例外につながるfxmlLoader.getController()?

System.out.println("from NAW: "+ NAC.newAccModel.users.getNumAccs()); 

以下のnullpointer例外が発生しています。私はここにgetController()

public class newAccountWindow extends Application { 



    Stage stage = new Stage(); 
    newAccountController NAC = new newAccountController(); 

public newAccountWindow(){ 
    Parent root=null; 
    try{ 
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("newAccountWindow.fxml")); 
    root = fxmlLoader.load(getClass().getResource("newAccountWindow.fxml")); 
    // fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory()); 
    NAC = (newAccountController) fxmlLoader.getController(); 
    System.out.println("from NAW: "+NAC.newAccModel.users.getNumAccs()); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    Scene scene = new Scene(root); 
    //scene.getStylesheets().add(MuseLogin.class.getResource("newAccCSS.css").toExternalForm());   
    stage.setScene(scene); 
} 

を呼び出すようにしようとしていますのはここ

java.lang.NullPointerException 
at muselogin.newAccountWindow.<init>(newAccountWindow.java:36) 
at muselogin.MuseLoginController.initialize(MuseLoginController.java:84) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124) 
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104) 
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097) 
at muselogin.MuseLogin.start(MuseLogin.java:22) 
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) 
at java.lang.Thread.run(Thread.java:745) 

である(ライン36はprintlnがある)、それはURLに渡すことにより

public class newAccountController implements Initializable { 

    newAccountModel newAccModel; 

    @FXML 
    private TextField usernameField; 
    @FXML 
    private PasswordField passwordField; 
    @FXML 
    private Button createAccount; 
    @FXML 
    private PasswordField confirmField; 
    @FXML 
    private Label usernameBlankMessage; 
    @FXML 
    private Label usernameTakenMessage; 
    @FXML 
    private Label passwordMessage; 


    //counter to check if all 3 conditions are met 
    int makeAcc = 0; 

    //action event for make account button clicked 
    @FXML 
    private void createAccountClicked(ActionEvent event) { 

     //does account creation stuff 

    } 

    public int getNumAccs(){ 
     return newAccModel.users.getNumAccs(); 
    } 

    //required initialize function, initializes model 
    @Override 
    public void initialize(URL url, ResourceBundle rb) { 

     newAccModel = new newAccountModel(); 

    } 

} 
+0

'newAccountModel()'のコンストラクターは何をしますか?あなたはそれのためのコードを提供していません。ユーザーに 'newAccountModel'を関連付け、' newAccountModel'の 'users'メンバーに参照を保存しますか?もしそうでなければ、おそらくあなたのNullPointerExceptionのソースです: 'users'はnullなので' users.getItems() 'はNullPointerExceptionをスローします。参照:[ヌルポインタ例外とは何ですか?どうすれば修正できますか?](http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how-do-i -fix-it)[クラス命名規則](http://www.iwombat.com/standards/JavaStyleGuide.html)に従ってください。 – jewelsea

答えて

0

を重要ならば、コントローラでありますloadメソッドの場合、staticloadのいずれかの方法をFXMLLoader、利用可能なインスタンスに関する情報がないため、コントローラをFXMLLoaderインスタンスに格納することはできません。

すでにFXMLLoaderコンストラクタでURLを指定しているので、代わりに単にパラメータなしloadメソッドを使用します。

root = fxmlLoader.load(); 
+0

これは魅力的に機能しました!なぜurlの2番目の宣言がnullコントローラを返す原因になるのでしょうか? – Chase

+0

@Chase: 'fxmlLoader.load(url);を書くことは' FXMLLoader.load(url) 'と同じ効果があります。そのロードメソッドは 'static'なので、メソッドが作成したコントローラインスタンスを使用している(使用していない)' FXMLLoader'インスタンスと関連付けることができる情報はありません。コントローラのような 'FXMLLoader'のプロパティにアクセスしたいのであれば(読み込み中に作成されたものと仮定して)、' static'' load'メソッドのどれかを使う必要があります。 – fabian

0
NAC = (newAccountController) fxmlLoader.getController(); 
System.out.println("from NAW: "+NAC.newAccModel.users.getNumAccs()); 

あなたはgetController後sysoutを行うことはできませんが。あなたがやっていることは、コントローラinitilizeの方法でnewAccModelを作成または初期化することです。 intializeは呼び出しを取得するためにいつかかかりました。ロード完了時に呼び出されます。しかし、この行の後には、ロードが準備できていませんでした。 NPEを提供するだけですコントローラーでinitializeメソッドを実行した後にnewAccModelにアクセスしていることを確認してください。