ArrayIndexOutOfBoundsException将C#转换为Java

时间:2015-01-24 06:11:55

标签: java c# arraylist

我正在开发一个程序,它将遍历记录列表(ID和Tickets)并分别将它们解析为两个列表。它还将交叉搜索列表,以查看哪些ID具有基于名称的相应票证。以下是早期版本的链接:here 现在,我一直在使用同事的一些C#代码进行重写,但是我遇到了解析方法的问题。这是C#版本:

        public void parseLine(string _line)
    {
        if(string.IsNullOrWhiteSpace(_line)){ return;}

        code        = _line.Substring(0, 3);
        ticketID    = _line.Substring(3, 10);

        string tmp = _line.Substring(13).Trim();

        //get the first and last name
        string [] tmp1 = tmp.Split(",".ToCharArray());

        if(!(tmp1.Length > 1))
        {
            throw new Exception("unable to get the first and last name");
        }

        lastname        = tmp1[0];
        firstname       = tmp1[1].Trim();

    }

这是我的Java版本:

    public void parseLine(String line) throws Exception {
            // code will store Ticket code *Alpha ticketId will store 10
            // *digit code
    code = line.substring(0, 3);
    ticketId = line.substring(3, 10);

            // tmp will store everything afterthe first 13 characters of 
            // line and trim the name(s)
    String tmp = line.substring(13).trim();

            // tmp1 array
    String[] tmp1 = tmp.split(".*,.*");

    if (tmp1.length > 1) {

        throw new Exception("UNABLE TO GET NAME");

    }

    last = tmp1[0];
    first = tmp1[1].trim();
}

这是一个单独的类,它将用票证为人们建模。我的主类(到目前为止)调用实际的parseLine方法如下:

public class ParkingTickets {

public static void main(String[] args) throws 
        FileNotFoundException, Exception {

ArrayList<TicketPeople> tickets = new ArrayList<>();
HashMap<String, List<SbPeople>> people = new HashMap<>();
File srcFile = new File("source.txt");

Scanner myScanner = new Scanner(srcFile);

    while (myScanner.hasNextLine()) {
    String line = myScanner.nextLine();
    //System.out.println(line);
    if (line.matches("^\\p{Alpha}.*$")) {
    //System.out.printf("Ticket: %s%n", line);
        TicketPeople t = new TicketPeople();
        t.parseLine(line);
        tickets.add(t);
        }
        myScanner.close();
    }

}

}

编译器指向parseLine方法中的if语句,显然是主类中的parseLine方法,当我尝试单步执行该sepcifiv行时,我看到它开始解析源文件中的数据但是有些东西是关闭的。从文档中,错误意味着:抛出以指示已使用非法索引访问数组。索引为负数或大于或等于数组的大小。 我使用了一个ArrayList作为故障单列表,根据我的理解,它是一个动态列表,不需要使用特定的索引大小进行设置。我还在学习,并且无法理解这个异常。我非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您使用Java调用split(),与C#中的split()不匹配。

// String[] tmp1 = tmp.split(".*,.*");
String[] tmp1 = tmp.split(","); // <-- ",".

另外,您的检查逻辑似乎已被颠倒过来。但是,我建议

if (tmp1.length != 2) {
    throw new Exception("UNABLE TO GET NAME");
}

答案 1 :(得分:0)

1)在C#中,它是Substring(int startIndex,int length)。在java String substring(int startindex,int endindex)中。

2)java代码也改变了异常逻辑。在C#代码中,不是if(!(tmp1.Length&gt; 1)),而在java代码中,if(tmp1.length&gt; 1)