我找不到导致异常的原因

时间:2012-11-19 03:11:07

标签: java file csv

我是一个java noob以及这个网站的新手,所以请在这里忍受我。如果我在发帖时做错了,请告诉我,我会事先为我做的事情或任何不好的语法道歉。

我需要在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");
        }
    }
}

我已经尝试删除所有逻辑并测试它是否与文件相关。这读得很好,所以我认为它与逻辑相关。我看了一眼,发现它没有任何问题。我甚至有一个朋友仔细研究并说它看起来很好。抛出的异常在哪里?

3 个答案:

答案 0 :(得分:3)

您没有初始化此行values中的String[] values = null;,因此当您使用它时会失败,即列在values[c2] = str.substring(c3, (c1 - 1));列。

要解决此问题,请使用适当的长度初始化values数组,例如String[] values = new String[SIZE];。您可能需要使用str.length()作为数组的SIZE

同样在您的比较else if (s == ",")中,您使用==比较字符串,这是不正确的。相反,您可以将x本身用作else if (x == ',')

修改:由于您未在任何地方更改c1的值,因此下面的条件会使str(x after correction as advised)无限增加。

旧条件:

             while (s != "\"")
                  c1++;

按照建议更改后(仍然错误,因为x在while循环中没有变化):

             while (x != '"')
                  c1++;

请更正循环逻辑。

答案 1 :(得分:1)

与具体问题无关,但与s == ","无关,您应该执行",".equals(s),类似于其他字符串相等性检查。

答案 2 :(得分:0)

这不是你的例外的原因,但它显然是不正确的:

    while (s != "\"")
        c1++;

这有两个原因:

  • 由于c1++不会改变循环条件,因此这将永远循环。
  • 当您使用==时,您正在使用!= / equals(...)来比较字符串。你似乎也在其他地方犯了这个错误。

要找出导致异常的原因,首先应该打印出堆栈跟踪。将e.printStackTrace();添加到catch块。

或者更好的是,将其更改为仅捕获IOException。捕获Exception是一个坏主意...除非您要记录/输出完整的堆栈跟踪。