Java 我找不到导致异常的原因
我是一个JavaNoob,也是这个网站的新手,所以请在这里耐心等待。如果我在发布这篇文章时犯了错误,请让我知道,我为我所做的任何事情或任何错误的语法提前道歉 我需要用java编写一个自定义CSV解析器,它不会在引号中分隔逗号。我不能使用任何与CSV类相关的内容。 1,2,3,4 -> 1 2 3 4 a、 “b,c”,d->a b,c d 不管我做什么,我总是会有例外Java 我找不到导致异常的原因,java,file,csv,Java,File,Csv,我是一个JavaNoob,也是这个网站的新手,所以请在这里耐心等待。如果我在发布这篇文章时犯了错误,请让我知道,我为我所做的任何事情或任何错误的语法提前道歉 我需要用java编写一个自定义CSV解析器,它不会在引号中分隔逗号。我不能使用任何与CSV类相关的内容。 1,2,3,4 -> 1 2 3 4 a、 “b,c”,d->a b,c d 不管我做什么,我总是会有例外 import java.io.*; import java.util.*; public class csv
import java.io.*;
import java.util.*;
public class csv
{
public static void main(String[] args)
{
File file = new File("csv.test");
BufferedReader buf = null;
try
{
buf = new BufferedReader(new FileReader(file));
String str;
while ((str = buf.readLine()) != null)
{
String[] values = null; // array for saving each split substr
int c1 = 0; // counter for current position in string
int c2 = 0; // counter for next space in array to save substr
int c3 = 0; // location of last comma or quotation for substring creation
int i = 0; // counter used later for printing
while (c1 <= str.length())
{
char x = str.charAt(c1);
String s = Character.toString(x);
if (c1 == str.length())
{
values[c2] = str.substring(c3, (c1 - 1));
}
else if (s == ",")
{
values[c2] = str.substring(c3, (c1 - 1));
c1++;
c2++;
c3++;
}
else if (s == "\"")
{
c1++;
c3 = c1;
while (s != "\"")
c1++;
values[c2] = str.substring(c3, (c1 - 1));
c1 = c1 + 2;
c2++;
c3 = c1;
}
else
{
c1++;
}
while (i < values.length)
System.out.println("\"" + values[i] + "\"");
}
}
}
catch (Exception e)
{
System.out.println("Error locating test file");
}
}
}
import java.io.*;
导入java.util.*;
公共类csv
{
公共静态void main(字符串[]args)
{
文件=新文件(“csv.test”);
BufferedReader buf=null;
尝试
{
buf=新的BufferedReader(新的文件读取器(文件));
字符串str;
而((str=buf.readLine())!=null)
{
String[]values=null;//用于保存每个拆分子字符串的数组
int c1=0;//字符串中当前位置的计数器
int c2=0;//数组中用于保存substr的下一个空格的计数器
int c3=0;//创建子字符串的最后一个逗号或引号的位置
int i=0;//稍后用于打印的计数器
而(c1您没有在这一行中初始化您的值字符串[]值=null;
因此当您使用它时,它将失败,即在列表值[c2]=str.substring(c3,(c1-1));
若要解决此问题,请使用适当的长度初始化值
数组,例如String[]values=new String[SIZE];
。您可能需要将str.length()
用作数组的SIZE
同样,在比较else if(s==“,”)
时,您使用=
比较字符串,这是不正确的。相反,您可以使用x
本身作为else if(x==”,')
编辑:您下面的条件将使c1
无限期递增,因为您不会在任何地方更改str(建议更正后的x)的值
旧条件:
while (s != "\"")
c1++;
按照建议进行更改后(仍然错误,因为x在while循环中没有更改):
请更正循环逻辑。与具体问题无关,但您应该执行,“”,“”。与其他字符串相等性检查类似,等于。这不是异常的原因,但显然是不正确的:
while (s != "\"")
c1++;
这是不正确的,原因有二:
- 由于
c1++
不会改变循环条件,因此将永远循环
- 当您应该使用
equals(…)
时,您正在使用==
/!=
来比较字符串。您似乎在其他地方也犯了这个错误
要找出导致异常的原因,首先应该打印stacktrace。将e.printStackTrace();
添加到catch块
或者更好的是,将其更改为只捕获IOException
。捕获Exception
是一个坏主意…除非您要记录/输出完整的堆栈跟踪。您可以包含完整的堆栈跟踪吗?这将是一个好的开始…您可以共享相关的堆栈跟踪吗?添加e.printStackTrace()
到捕捉
块,告诉我们它说了什么…+1作为一个良好的行为是noobjava.lang.NullPointerException在csv.main(csv.java:56)我在第46行得到了一个OutOfBounds异常,当我解决这个问题时。为什么?@user1834642:我相信你的第46行是这样的:values[c2]=str.substring(c3,(c1-1))
如果是,您的计数器,即c2、c3和c1
超出了字符串长度。请检查逻辑。@user1834642:while(s!=“\”)时您希望在行中看到什么c1++;
。这将导致您的c1++无限增加,因为您没有更改x
的值。如果==is s.equals()。@user1834642-!s.equals()
while (s != "\"")
c1++;