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