【问题标题】:Null Pointer Exception, when trying to replace characters from file尝试替换文件中的字符时出现空指针异常
【发布时间】:2012-01-26 21:20:40
【问题描述】:

我正在尝试用逗号替换文件中的字符 ( and ),以便我可以使用下面的代码将数据从 csv 文件输入到 JTable。我试图通过使用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;
    }

}

【问题讨论】:

    标签: java file-io jtable bufferedreader stringtokenizer


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您还应该小心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)
      

      【讨论】:

        【解决方案3】:

        包装你的代码

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

        【讨论】:

        • 嗯...这行不通,它甚至无法编译:-\ 你应该修改你的例子;o)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-16
        • 2020-11-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多