对于Java家庭作业,我需要创建一个读写CSV文件的类。我目前在阅读CSV时遇到一些问题。下面的代码只输出代码的第一行,然后生成以下错误消息:'线程中的异常“main”java.lang.ArrayIndexOutOfBoundsException:1,位于com.gc01.FileManager.CSVManager.main(CSVManager。的java:27)”
我查看了各种示例,我知道'opencsv'包,但我需要自己编写这段代码。我已将问题定位到语句“System.out.print(data [i]);”。但是,当交叉引用这段代码时,一切似乎都没问题。
我正在使用FileInput类中的方法,这是我老师指定的方法(http://www.devjavasoft.org/SecondEdition/SourceCode/Share/FileInput.java)。
public class CSVManager {
public static void main(String [] args){
Scanner sc = new Scanner (System.in);
System.out.println("Please enter the file directory of the chosen CSV");
System.out.println("For Example: /Users/UserName/Downloads/FileName.csv");
///Users/ReeceAkhtar/Desktop/GeoIPCountryWhois.csv
final String fileName = sc.nextLine();
System.out.println("How many columns?");
final int columns = sc.nextInt();
BufferedReader br = null;
String line = "";
String splitBy = " , ";
try {
br = new BufferedReader(new FileReader(fileName));
while((line = br.readLine()) != null) {
for (int i = 0; i < columns; i++) {
String[] data = line.split(splitBy);
System.out.print(data[i]);
}
}
} catch (FileNotFoundException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
System.out.println("File Read");
}
}
答案 0 :(得分:1)
例外很清楚
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
表示您正在尝试访问数组中不存在的第一个元素
由于您说System.out.print(data[i]);
是发生例外的行,因此对于第一行 data
必须只填充单个元素强>
使用IDE调试问题,找出split方法导致意外元素的原因。我怀疑使用,
周围的空格是" , "
答案 1 :(得分:1)
试试这个。如果你拆分for循环,一切都会好的。
String[] data = line.split(splitBy);
while((line = br.readLine()) != null){
for (int i = 0; i < columns; i++){
System.out.print(data[i]);
}
}
答案 2 :(得分:0)
while((line = br.readLine()) != null){
for (int i = 0; i < columns; i++){
String[] data = line.split(splitBy);
System.out.print(data[i]);
}
for
循环内多次拆分一行。" , "
进行拆分(,这可能是您遇到ArrayIndexOfBound
例外的原因)而是使用","
;如果您愿意,可以在trim()
上使用data[i]
来摆脱尾随/领先的空白区域。data.length
等于columns
的检查是否一致。try-with-resource
关闭try(){}
上下文中声明的资源,允许我们摆脱finally
块所以你的看起来应该如下:
try (BufferedReader br = new BufferedReader(new FileReader(fileName))){
while((line = br.readLine()) != null){
String[] data = line.split(splitBy);
if(data.length != columns)continue; // check for consistency,
//might throw an exception
for (int i = 0; i < columns; i++){
System.out.print(data[i].trim());
}
}catch(IoExection ex)
{
ex.printStackTrace();
}