无法找到arrayindexoutofbounds错误

时间:2015-10-11 21:28:30

标签: java arrays oop for-loop

我试图解决这个问题:https://kth.kattis.com/problems/genealogical并且那里唯一的测试用例非常完美。但纠正它的机器人说ArrayIndexOutOfBounds但不是我在哪里查看过但无法找到它。我添加了一些东西,比如第19行的if语句。这是我的代码:

public class Person {

private String name;
private String date;
private List<Person> children = new ArrayList<Person>();
private Person mom;
public boolean used = false;

private String deathDate = null;
private List<Person> ancestors = new ArrayList<Person>();
private List<Person> descendants = new ArrayList<Person>();


public Person getMom() {
    return mom;
}

private Person dad;
public Person getDad() {
    return dad;
}


public List<Person> getDescendants() {
    return descendants;
}

public List<Person> getAncestors() {
    return ancestors;
}

public Person(Person mom, Person dad)
{
    this.mom = mom;
    this.dad = dad;
}

public Person(String peo)
{
    name = peo;
}

public void setName(String name)
{
    this.name = name;
}

public String getName()
{
    return this.name;
}

public void setDate(String date)
{
    this.date = date;
}

public String getDate()
{
    return this.date;
}

public void addChild(Person child)
{
    children.add(child);
}

public void kill(String date)
{
    this.deathDate = date;
}

public void addAncestors(Person p)
{
    ancestors.add(p);
}

public void addDescendants(Person p)
{
    descendants.add(p);
}

public String getDeathdate()
{
    if(this.deathDate == null)
        return "";
    else
        return " " + this.deathDate;
}


}

这是我的班级:     import java.util.ArrayList;     import java.util.List;

"pip install deap"

任何人都有任何可能出错的想法?我只有一个for循环。我尝试将其更改为foreach循环,但随后以错误的顺序打印。

1 个答案:

答案 0 :(得分:1)

我没有检查您的完整代码,但请看一下这一行:

birth(childName, splitted[1], splitted[2], splitted[3]);

输入BIRTH会得到异常,因为splitted.length == 1并且它以BIRTH开头。

添加支票,例如:

if (firstLine.contains("BIRTH") && splitted.length == 4)
    ...
    birth(childName, splitted[1], splitted[2], splitted[3]);
    ...

一般情况下,请尝试输入格式错误的程序。

回答你的评论:

如果您看一下您可以看到的出生方法,参数母亲和父亲可以是空或空字符串,因为它只是他们的名字,如果不存在具有该名称的人,则创建一个新的。我没有检查问题,如果这是正确的行为,但从代码可能。

private static void birth(
        String child,
        String date,
        String mother,
        String father)

所以你可以将条件改为:

// We need the childName and date, so splitted.length must be >= 2
if (firstLine.contains("BIRTH") && splitted.length >= 2)
{
    String childName = splitted[0].substring(6);
    if ( splitted.length == 2)
        birth(
                childName,      // child name
                splitted[1],    // child birth date
                "NoName1",      // mothers name, check with your task what you should enter here
                "NoName2");     // fathers name, check with your task what you should enter here
    else if ( splitted.length == 3)
        birth(
                childName,      // child name
                splitted[1],    // child birth date
                splitted[2],    // mothers name
                "NoName");      // fathers name, check with your task what you should enter here
    else if (splitted.length == 4)
        birth(
                childName,      // child name
                splitted[1],    // child birth date
                splitted[2],    // mothers name
                splitted[3]);   // fathers name
}

但请检查您的任务是否应对省略的值使用某些默认值,例如父亲,母亲甚至日期和子名称。也许您只需要重新提示用户输入有效信息:

if (firstLine.contains("BIRTH") && splitted.length == 4)
    ...
    birth(childName, splitted[1], splitted[2], splitted[3]);
    ...
else
    // get the next input string

请注意,如果子名称不是至少6个字符,则以下行也会引发异常:

String childName = splitted[0].substring(6);