2016-06-01 15 views
0

Ich habe eine Schaltfläche, die nur alle Felder aus Datenbanktabellen lesen (wählen Sie * aus Filmen), also verwende ich AbstractTableModel. Erste Tabelle gelesen OK mit dieser Klasse, aber wenn ich AbstractTableModel für andere Tabelle implementieren, habe ich NPE.NullPointerException in AbstractTableModel getRowCount

Hier ist mein Code TableModelForMovies:

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(); 
     } 
    } 
} 

und Zuhörer auf meine Taste

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); 
} 

Ich verstehe wirklich nicht, warum ich NPE bekam. Weil ich zweite Klasse habe und es auch AbstractTableModel ausdehnt und es keine Fehler gibt, NPE gerade hier.

+1

Was mit den Mitarbeitern geschieht dagegen, wenn es keinen Film Name ist ? – paisanco

+0

@paisanco, ja, ich habe vergessen, eine Methode aufzurufen, wird es alle unsere Tabelle ausgeben, in einem anderen Fall können wir nach Namen finden, aber NPE in der Klasse TableModel –

+0

1) Eine einzige leere Zeile von Leerzeichen im Quellcode ist alles, was ist * jemals * benötigt. Leere Zeilen nach '{' oder vor '}' sind normalerweise redundant. 2) Kleingeschriebene Wörter sind schwer zu lesen, wie wenn man jemandem zuhört, der murmelt. Bitte verwenden Sie einen Großbuchstaben am Anfang von Sätzen, für das Wort I, und Eigennamen wie 'ArrayList' oder Oracle. 3) Um eine bessere Hilfe zu erhalten, sollten Sie ein [MCVE] oder [Short, Self Contained, Correct Example] (http://www.sscce.org/) veröffentlichen. Codieren Sie einige Daten, um die DB zu ersetzen. –

Antwort

0

Es kann möglich, dass getRowCount() Verfahren vor der movies aufgerufen Liste initialisiert wird, wenn Sie getRowCount() Methode überschreiben, bitte folgendes Muster verwenden:

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

ok, vielen Dank, ich benutze kein Methid, ich habe den Fehler in meiner Klasse mit Getter und Setter gemacht, jetzt funktioniert es aber danke) –

Verwandte Themen