2017-06-21 6 views
0

のは、次のコードを考えてみましょう:私は[名前]列のセルを編集するときJavaFXのsetCellValueFactory:NullpointerExceptionが発生

package stackoverflow; 

import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.control.cell.TextFieldTableCell; 
import javafx.util.StringConverter; 

import java.net.URL; 
import java.util.ResourceBundle; 

public class TestController implements Initializable { 

    @FXML 
    private TableView<TestRow> table; 
    @FXML 
    private TableColumn<TestRow, String> myColumn; 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 

     table.setEditable(true); 

     myColumn.setCellValueFactory(data ->data.getValue().nameProperty()); 
     myColumn.setCellFactory(factory -> new TextFieldTableCell<>(new StringConverter<String>() { 
      @Override public String toString(String object) { 
       return object; 
      } 

      @Override public String fromString(String string) { 
       return string; 
      } 
     })); 
     myColumn.setPrefWidth(200); 

     table.getItems().add(new TestRow("Name1")); 
     table.getItems().add(new TestRow("Name2")); 
    } 
} 

は時々私はラインmyColumn.setCellValueFactory(data->data.getValue().nameProperty());NullpointerExceptionを持って、私は、私がデバッグで入力された理由はわかりませんし、それはdata.getValue()がNULLであることを示しているので、NPEが適用されたときには.nameProperty()が当てはまります。問題はいつデータがnullであり、その理由は何か?私は把握しようとしていたが、単に何も見つけられなかった。デバッグで私はdata.getTableView()。getItems()を探していましたが、それはそれらが追加された2つの行を返します。 data.getValue()tableに含まれている既存のTestRowインスタンスを返さなければならない理由は何ですか?

+1

最も単純な説明は、テーブルビューに項目として 'null'が挿入されたことです。テーブルに新しい項目を追加するすべての場所をチェックして、ヌル値を追加しないことを確認できます。コードにこのような場所がたくさんある場合は、質問を編集してすべての質問を投稿できます。 – Itai

答えて

0

私は同じ問題を抱えていて、常にnull値をチェックすることで修正しました。

私は、TableRowがnull値を受け取っても何らかの方法でグラフィックコンポーネントとして表示する必要があり、CellとValueFactoryは呼び出し(空の行にカスタム値を表示することもできます) 。

+0

しかし、私が知っているように、ヌルチェックをするのは悪い習慣です。私は、あなたがスーパーでクリーンで完璧なコードを書いているなら、ヌルをチェックする必要はないので、これが私の問題を解決することを誓います。 'NPE'のソースを入手すると、予期せぬバグが発生する可能性があります。そのバグがなぜ発生したのかを検出するのはずっと難しくなります。 – Sunflame

+0

私はヌルチェックが主に悪いアプリケーションデザインの証拠であることに同意します。この場合、別の方法で空の行を管理できるはずです。 –

+0

この場合、セルから来たデータを処理するのでnullcheckを置くことはできません。そこにあると思われるデータでないものがあれば、矛盾したデータが得られます。 – Sunflame

関連する問題