2012-01-26 2 views
0

Я пытаюсь заменить символ (и) из файла запятой, чтобы я мог использовать приведенный ниже код для ввода данных в файл JTable из файла csv. Я попытался сделать это, прочитав файл с StringTokenizer, и я попытался манипулировать тем, как я его реализую, и я не могу заставить его работать с NullPointerException. Я понимаю, что он не может найти объект, на который он указывает, но я не вижу, где моя проблема. Любые указатели были бы замечательными, поскольку я застрял на этом часами. Является ли идея чтения с помощью StringTokenizer лучшей или лучше? Полученная ошибка выглядит следующим образом.Null Pointer Exception при попытке заменить символы из файла

 
java.lang.NullPointerException 
    at initial.DisplayTableModel.fileImport(DisplayTableModel.java:29) 
    at initial.DisplayTableModel.(DisplayTableModel.java:15) 
    at initial.Display.(Display.java:15) 
    at initial.Display.main(Display.java:27) 
    Exception in thread "AWT-EventQueue-0" java.lang.ArithmeticException:/by zero 
    at initial.DisplayTableModel.getRowCount(DisplayTableModel.java:85) 
    at javax.swing.JTable.getRowCount(Unknown Source) 
    at javax.swing.plaf.basic.BasicTableUI.createTableSize(Unknown Source) 
    at javax.swing.plaf.basic.BasicTableUI.getPreferredSize(Unknown Source) 
    at javax.swing.JComponent.getPreferredSize(Unknown Source) 
    at javax.swing.ScrollPaneLayout.layoutContainer(Unknown Source) 
    at java.awt.Container.layout(Unknown Source) 
    at java.awt.Container.doLayout(Unknown Source) 
    at java.awt.Container.validateTree(Unknown Source) 
    at java.awt.Container.validateTree(Unknown Source) 
    at java.awt.Container.validateTree(Unknown Source) 
    at java.awt.Container.validateTree(Unknown Source) 
    at java.awt.Container.validateTree(Unknown Source) 
    at java.awt.Container.validateTree(Unknown Source) 
    at java.awt.Container.validate(Unknown Source) 
    at java.awt.window.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$000(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue$4.run(Unknown Source) 
    at java.awt.EventQueue$4.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 

Есть два других классов, включенные в эту модель, но они не возвращают ошибку, когда секция скобки заменить закомментирована.

package initial; 

import javax.swing.table.*; 
import java.io.*; 
import java.util.*; 

@SuppressWarnings("serial") 
public class DisplayTableModel extends AbstractTableModel { 
    protected Vector<String> data; 
    protected Vector<String> columnNames; 
    protected String datafile; 

    public DisplayTableModel(String f) { 
     datafile = f; 
     fileImport(); 
    } 

    public void fileImport() { 
     String aLine; 
     data = new Vector<String>(); 
     columnNames = new Vector<String>(); 
     try { 

      FileInputStream fin = new FileInputStream(datafile); 
      BufferedReader br = new BufferedReader(new InputStreamReader(fin)); 

      aLine = br.readLine(); 
      String strReplace = ")"; 

       br.readLine().replaceAll(strReplace, ","); 
       StringTokenizer Yearquote = new StringTokenizer(aLine, ")"); 

       columnNames.addElement(Yearquote.nextToken()); 
       StringTokenizer st1 = new StringTokenizer(br.readLine(), ","); 
       while (st1.hasMoreTokens()) { 

        columnNames.addElement(Yearquote.nextToken()); 
       } 

       // extract data 

      while (aLine != null) { 

       if (aLine.startsWith("\"")) { 
        StringTokenizer addquote = new StringTokenizer(aLine, "\""); 
        data.addElement(addquote.nextToken()); 
        StringTokenizer st2 = new StringTokenizer(addquote 
          .nextToken(), ","); 

        while (st2.hasMoreTokens()) { 

         data.addElement(st2.nextToken()); 
        } 
       } else { 
        StringTokenizer st2 = new StringTokenizer(aLine, ","); 

        while (st2.hasMoreTokens()) { 

         data.addElement(st2.nextToken()); 
        } 
       } 

      } 

      br.close(); 
     } 

     catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    public int getRowCount() { 
     return data.size()/getColumnCount(); 
    } 

    public int getColumnCount() { 
     return columnNames.size(); 
    } 

    public String getColumnName(int columnIndex) { 
     String colName = ""; 

     if (columnIndex <= getColumnCount()) { 
      colName = columnNames.elementAt(columnIndex); 
     } 
     return colName; 

    } 

    public Class<String> getColumnClass(int columnIndex) { 
     return String.class; 
    } 

    public boolean isCellEditable(int rowIndex, int columnIndex) { 
     return true; 
    } 

    public Object getValueAt(int rowIndex, int columnIndex) { 
     return data.elementAt((rowIndex * getColumnCount()) + columnIndex); 
    } 

    public void setValueAt(Object aValue, int rowIndex, int columnIndex) { 
     return; 
    } 

} 

ответ

1

Номер строки (строка 29 в трассе стека) - большой наконечник. Скорее всего, br.readline().replaceAll() вызывает нулевой указатель, когда вы вызываете br.readline() дважды подряд, не проверяя, что в потоке есть контент, а второй вызов, скорее всего, после того, как вы исчерпали поток.

0

обернуть код вокруг

while ((aLine = br.readLine()) != null) { 
      aLine.replaceAll(strReplace, ","); 
      //logic here 
     } 
+0

Мммм ... Это не может работать, не даже компиляции: - \ Вы должны переработать ваш пример; o) – Laf

1

Вы также должны быть осторожны с линией return data.size()/getColumnCount();. Вы могли бы в конечном итоге деления на 0, что, кажется, ваш случай, судя по следующим направлениям исключением:

Exception in thread "AWT-EventQueue-0" java.lang.ArithmeticException:/by zero 
at initial.DisplayTableModel.getRowCount(DisplayTableModel.java:85) 
at javax.swing.JTable.getRowCount(Unknown Source)