Исключение нулевого указателя при попытке заменить символы из файла

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

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

}

person Ed Moore    schedule 26.01.2012    source источник


Ответы (3)


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

person Nick Garvey    schedule 26.01.2012

Вы также должны быть осторожны со строкой 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)
person Laf    schedule 26.01.2012

оберните свой код вокруг

while ((aLine = br.readLine()) != null) {
            aLine.replaceAll(strReplace, ",");
            //logic here
        }
person RanRag    schedule 26.01.2012
comment
Мммм... Это не может работать, оно даже не компилируется :-\ Вы должны переработать свой пример ;o) - person Laf; 27.01.2012