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

Я пытаюсь заменить символ (и) в файле запятой, чтобы использовать приведенный ниже код для ввода данных в 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;
    }

}

Ответы [ 3 ]

1 голос
/ 27 января 2012

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

1 голос
/ 27 января 2012

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

0 голосов
/ 27 января 2012

оберните ваш код вокруг

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