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