簡體   English   中英

嘗試從文件中替換字符時出現空指針異常

[英]Null Pointer Exception, when trying to replace characters from file

我試圖用逗號替換文件中的字符(和),以便我可以使用下面的代碼從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)

此模型還包含其他兩個類,但在替換括號部分時,它們不會返回錯誤。

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

}

行號(堆棧跟蹤中的第29行)是一個很大的提示。 最有可能的是, br.readline().replaceAll()導致空指針,因為你連續兩次調用br.readline()而沒有檢查流中是否有內容,第二次調用很可能是在你已經筋疲力盡之后流。

你還應該小心行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)

包裝你的代碼

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM