2016-06-01 7 views
0

私はデータベーステーブル(select * from movies)からすべてのフィールドを読み込むボタンしか持っていないので、AbstractTableModelを使用します。最初のテーブルはこのクラスでOKを読んでいますが、他のテーブルにAbstractTableModelを実装するとNPEを取得できます。私はNPEを得た理由は、私は本当に理解していないAbstractTableModelのNullPointerException getRowCount

try { 
    String movieName = textFindField.getText(); 
    List<Movie> employees = null; 
    if (movieName != null && movieName.trim().length() > 0) { 
     //employees = movieDao.search(lastName); 
     employees = movieDao.getAllMovies(); 
    } else { 
     searchByName(); 
    } 

    // create the model and update the "table" 
    TableModelForMovies model = new TableModelForMovies(employees); 

    tableMovies.setModel(model); 
} catch (Exception exc) { 
    JOptionPane.showMessageDialog(AppMovies.this, "Error: " + exc, "Error", JOptionPane.ERROR_MESSAGE); 
} 

私のボタンを

package ua.movies.movie; 

import java.util.ArrayList; 
import java.util.List; 

import javax.swing.table.AbstractTableModel; 

public class TableModelForMovies extends AbstractTableModel { 

    private static final int NAME_COL = 0; 
    private static final int Genre_COL = 1; 
    private static final int Release_Date = 2; 
    private static final int Unique = 3; 

    private String[] columnNames = { "name", "genre", 
    "release" , "dgdggdf" }; 

    private List<Movie> movies; 

    public TableModelForMovies(List<Movie> theMovie) { 
     movies = theMovie; 
    } 

    @Override 
    public int getRowCount() { 
     return movies.size(); <<- here is problem 
    } 

    @Override 
    public int getColumnCount() { 
     return columnNames.length; 
    } 

    @Override 
    public String getColumnName(int col) { 
     return columnNames[col]; 
    } 

    @Override 
    public Object getValueAt(int rowIndex, int columnIndex) { 
     Movie tmpMovie = movies.get(rowIndex); 
     switch (columnIndex) { 
     case NAME_COL: 
      return tmpMovie.getMovieName(); 
     case Genre_COL: 
      return tmpMovie.getGenre();  
     case Release_Date: 
      return tmpMovie.getRelease(); 
     case Unique: 
      return tmpMovie.getUniqueKey(); 

     default: 
      return tmpMovie.getMovieName(); 
     } 
    } 
} 

とリスナー:

は、ここに私のコードTableModelForMoviesです。私はセカンドクラスを持っていて、それはまたAbstractTableModelを拡張しているので、エラーはありません。ここではNPEだけです。あなたがgetRowCount()メソッドをオーバーライドしているとき

+1

を従業員とどうなり全く映画の名がない場合、オブジェクト? – paisanco

+0

@paisanco、私はメソッドを呼び出すのを忘れてしまったので、私たちのテーブルをすべて出力します。別のケースでは名前で見つけることができますが、TableModelクラスのNPE –

+0

1)ソースコード内の空白の空白行はすべて1つです*これまでに必要なもの。 '{'の前または '}'の前の空白行も通常は冗長です。 2)すべての小文字で書かれた言葉は、混乱している人の話を聞くような、読みにくい。文頭に大文字、Iという単語、 'ArrayList'やOracleなどの適切な名前を使用してください。 3)もっと早い時期に、[MCVE]または[短く、自己完結型の正しい例](http://www.sscce.org/)を投稿してください。一部のデータをハードコードしてDBに置き換えます。 –

答えて

0

それはmoviesリストが初期化される前にgetRowCount()メソッドが呼び出される、という可能性は、次のパターンを使用してください可能性があります

@Override 
    public int getRowCount() 
    { 
    int result = 0; 
    synchronized(LOCK) { 
     if(movies != null) { 
     result = movies.size(); 
     } // if 
    } // synchronized 
    return result; 
    } 
+0

ok、ありがとう、私はあなたのメシドを使用しないで、私はゲッターとセッターで私のクラスで間違いを犯しました。 –

関連する問題