0

我正在尝试用逗号替换文件中的字符 ( and ),以便我可以使用下面的代码将数据JTable从 csv 文件输入到 a 中。我试图通过使用 a 读取文件来做到这一点,StringTokenizer并且我尝试操纵我实现它的方式,但我无法让它与NullPointerException. 我知道它找不到它指向的对象,但我看不出我的问题出在哪里。任何指针都会很棒,因为我已经坚持了几个小时。阅读的想法是使用StringTokenizer最好的还是有更好的方法?产生的错误如下。

java.lang.NullPointerException
    在 initial.DisplayTableModel.fileImport(DisplayTableModel.java:29)
    在 initial.DisplayTableModel.(DisplayTableModel.java:15)
    在 initial.Display.(Display.java:15)
    在 initial.Display.main(Display.java:27)
    线程“AWT-EventQueue-0”中的异常 java.lang.ArithmeticException:/ 为零
    在 initial.DisplayTableModel.getRowCount(DisplayTableModel.java:85)
    在 javax.swing.JTable.getRowCount(未知来源)
    在 javax.swing.plaf.basic.BasicTableUI.createTableSize(未知来源)
    在 javax.swing.plaf.basic.BasicTableUI.getPreferredSize(未知来源)
    在 javax.swing.JComponent.getPreferredSize(未知来源)
    在 javax.swing.ScrollPaneLayout.layoutContainer(未知来源)
    在 java.awt.Container.layout(未知来源)
    在 java.awt.Container.doLayout(未知来源)
    在 java.awt.Container.validateTree(未知来源)
    在 java.awt.Container.validateTree(未知来源)
    在 java.awt.Container.validateTree(未知来源)
    在 java.awt.Container.validateTree(未知来源)
    在 java.awt.Container.validateTree(未知来源)
    在 java.awt.Container.validateTree(未知来源)
    在 java.awt.Container.validate(未知来源)
    在 java.awt.window.dispatchEventImpl(未知来源)
    在 java.awt.Component.dispatchEvent(未知来源)
    在 java.awt.EventQueue.dispatchEventImpl(未知来源)
    在 java.awt.EventQueue.access$000(未知来源)
    在 java.awt.EventQueue$3.run(未知来源)
    在 java.awt.EventQueue$3.run(未知来源)
    在 java.security.AccessController.doPrivileged(本机方法)
    在 java.security.ProtectionDomain$1.doIntersectionPrivilege(未知来源)
    在 java.security.ProtectionDomain$1.doIntersectionPrivilege(未知来源)
    在 java.awt.EventQueue$4.run(未知来源)
    在 java.awt.EventQueue$4.run(未知来源)
    在 java.security.AccessController.doPrivileged(本机方法)
    在 java.security.ProtectionDomain$1.doIntersectionPrivilege(未知来源)
    在 java.awt.EventQueue.dispatchEvent(未知来源)
    在 java.awt.EventDispatchThread.pumpOneEventForFilters(未知来源)
    在 java.awt.EventDispatchThread.pumpEventsForFilter(未知来源)
    在 java.awt.EventDispatchThread.pumpEventsForHierarchy(未知来源)
    在 java.awt.EventDispatchThread.pumpEvents(未知来源)
    在 java.awt.EventDispatchThread.pumpEvents(未知来源)
    在 java.awt.EventDispatchThread.run(未知来源)

此模型中还包含另外两个类,但当替换括号部分被注释掉时,它们不会返回错误。

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

}
4

3 回答 3

1

行号(堆栈跟踪中的第 29 行)是一个很大的提示。最有可能的是,当您连续br.readline().replaceAll()调用两次而没有检查流中是否有内容时导致空指针,并且第二次调用可能是在您用尽流之后。br.readline()

于 2012-01-26T21:24:24.953 回答
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)
于 2012-01-26T21:27:48.407 回答
0

包装你的代码

while ((aLine = br.readLine()) != null) {
            aLine.replaceAll(strReplace, ",");
            //logic here
        }
于 2012-01-26T21:26:18.463 回答