Java 尝试替换文件中的字符时出现空指针异常

Java 尝试替换文件中的字符时出现空指针异常,java,file-io,jtable,bufferedreader,stringtokenizer,Java,File Io,Jtable,Bufferedreader,Stringtokenizer,我试图用逗号替换文件中的字符(and),这样我就可以使用下面的代码将数据输入csv文件中的JTable。我试图通过使用StringTokenizer读取文件来实现这一点,但我试图操纵实现它的方式,但我无法让它使用NullPointerException运行。我知道它找不到它指向的对象,但我看不到我的问题在哪里。任何指点都会很好,因为我已经被困在这个问题上好几个小时了。使用StringTokenizer阅读是最好的方法还是有更好的方法?产生的错误如下 java.lang.NullPointerEx

我试图用逗号替换文件中的字符(and),这样我就可以使用下面的代码将数据输入csv文件中的
JTable
。我试图通过使用
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) 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.arithmetricException中的异常:/by zero 在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.ScrollPanelLayout.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;
    }

}
包首字母;
导入javax.swing.table.*;
导入java.io.*;
导入java.util.*;
@抑制警告(“串行”)
公共类DisplayTableModel扩展了AbstractTableModel{
受保护的矢量数据;
受保护的向量列名称;
受保护的字符串数据文件;
公共DisplayTableModel(字符串f){
数据文件=f;
fileImport();
}
public void fileImport(){
弦线;
数据=新向量();
columnNames=新向量();
试一试{
FileInputStream fin=新的FileInputStream(数据文件);
BufferedReader br=新的BufferedReader(新的InputStreamReader(fin));
aLine=br.readLine();
字符串strReplace=“)”;
br.readLine().replaceAll(strReplace,“,”;
StringTokenizer Yearquote=新的StringTokenizer(aLine,“)”;
columnNames.addElement(Yearquote.nextToken());
StringTokenizer st1=新的StringTokenizer(br.readLine(),“,”);
while(st1.hasMoreTokens()){
columnNames.addElement(Yearquote.nextToken());
}
//提取数据
while(aLine!=null){
if(aLine.startsWith(“\”)){
StringTokenizer addquote=新的StringTokenizer(aLine,“\”);
data.addElement(addquote.nextToken());
StringTokenizer st2=新的StringTokenizer(addquote
.nextToken(),“,”);
while(st2.hasMoreTokens()){
data.addElement(st2.nextToken());
}
}否则{
StringTokenizer st2=新的StringTokenizer(aLine,“,”);
while(st2.hasMoreTokens()){
data.addElement(st2.nextToken());
}
}
}
br.close();
}
捕获(例外e){
e、 printStackTrace();
}
}
public int getRowCount(){
返回data.size()/getColumnCount();
}
public int getColumnCount(){
返回columnNames.size();
}
公共字符串getColumnName(int columnIndex){
字符串colName=“”;
如果(columnIndex行号(堆栈跟踪中的第29行)是一个大提示。很可能,
br.readline().replaceAll()
在调用
br.readline()时导致空指针
连续两次,不检查流中是否有内容,第二次调用可能是在您耗尽流之后。

将代码包装起来

while ((aLine = br.readLine()) != null) {
            aLine.replaceAll(strReplace, ",");
            //logic here
        }
你也应该是c
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)