0

JTable以下のコードを使用して csv ファイルからデータを入力できるように、ファイルの文字 ( および ) をコンマに置き換えようとしています。でファイルを読み取ってこれを実行しようとしStringTokenizerましたが、実装方法を操作しようとしましたが、で実行できませんNullPointerException。指しているオブジェクトが見つからないことは理解していますが、問題がどこにあるのかわかりません。私は何時間もこれにこだわっていたので、どんな指針も素晴らしいでしょう。最高のものを使用して読むという考えStringTokenizerはありますか、それともより良い方法がありますか? 生成されるエラーは次のとおりです。

java.lang.NullPointerException
    initial.DisplayTableModel.fileImport(DisplayTableModel.java:29) で
    initial.DisplayTableModel.(DisplayTableModel.java:15) で
    at initial.Display.(Display.java:15)
    initial.Display.main(Display.java:27) で
    スレッド「AWT-EventQueue-0」での例外 java.lang.ArithmeticException: / 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.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 (不明なソース) で
    at 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 で (不明なソース)

このモデルには他に 2 つのクラスが含まれていますが、ブラケットの置換セクションがコメント アウトされている場合、これらのクラスはエラーを返しません。

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 行目) は大きなヒントです。ほとんどの場合、ストリームにコンテンツがあることを確認せずに 2 回続けbr.readline().replaceAll()て呼び出すと、null ポインターが発生し、br.readline()2 回目の呼び出しはストリームを使い果たした後に発生する可能性があります。

于 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 に答える