Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我找不到导致异常的原因_Java_File_Csv - Fatal编程技术网

Java 我找不到导致异常的原因

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

我是一个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
{
    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++;