【问题标题】:Can't find the arrayindexoutofbounds error找不到 arrayindexoutofbounds 错误
【发布时间】:2016-01-09 07:01:47
【问题描述】:

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

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;


public class Genealogical {

private static List<Person> persons = new ArrayList<Person>();

public static void main(String[] args)
{
    Scanner input = new Scanner(System.in);


    while(true)
    {
        String firstLine = input.nextLine();
        String[] splitted = firstLine.split(" : ");
        if(splitted.length == 0)
        {
            System.exit(0);
        }

        if(firstLine.contains("BIRTH"))
        {
            String childName = splitted[0].substring(6);
            birth(childName, splitted[1], splitted[2], splitted[3]);
        }

        else if(firstLine.contains("DEATH"))
        {
            if(!firstLine.contains(" : "))
            {
                if(persons.size() > 0)
                    persons.get(persons.size() - 1).kill(firstLine.substring(6));
            }
            else
            {
                String name = splitted[0].substring(6);
                getPerson(name).kill(splitted[1]);
            }
        }

        else if(firstLine.contains("ANCESTORS"))
        {
            String name = splitted[0].substring(10);

            Person ancestor = getPerson(name);
            for(Person p : persons)
            {
                if(p.getName().equals(name) || p.used)
                {
                    continue;
                }

                else
                {
                    p.used = true;
                    ancestor.addAncestors(p);
                }
            }
        }

        else if(firstLine.contains("DESCENDANTS"))
        {

            String name = splitted[0].substring(12);

            Person descendant = getPerson(name);
            for(Person p : persons)
            {
                if(p.getName().equals(name) || p.used)
                {
                    continue;
                }

                else
                {
                    p.used = true;
                    descendant.addDescendants(p);
                }
            }
        }

        else if(firstLine.contains("QUIT"))
        {
            if(persons.size() > 0)
            {
                for(int i = persons.size() - 1; i >= 0; i--)
                {
                    Person p = persons.get(i);

                    if(p.getAncestors().size() > 0)
                    {
                        printAncestor(p);

                    }

                    if(p.getDescendants().size() > 0)
                    {
                        printDescendant(p);
                    }

                }
            }

            System.exit(0);


        }
    }



}

public static void printAncestor(Person p)
{
    System.out.println("ANCESTORS of " + p.getName());
    for(Person ancestor : p.getAncestors())
    {
        System.out.println("  " + ancestor.getName() + " " + ancestor.getDate() + " -" + ancestor.getDeathdate());
        System.out.println("    " + ancestor.getDad().getName());
        System.out.println("    " + ancestor.getMom().getName());
    }

    System.out.println();
}

public static void printDescendant(Person p)
{
    System.out.println("DESCENDANTS of " + p.getName());
    for(Person descendant : p.getDescendants())
    {
        System.out.println("  " + descendant.getName() + " " + descendant.getDate() + " -" + descendant.getDeathdate());

    }

}

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

    Person mom = getPerson(mother);
    if(mom == null)
    {
        mom = new Person(null, null);
        mom.setName(mother);
    }
    Person dad = getPerson(father);
    if(dad == null)
    {
        dad = new Person(null, null);
        dad.setName(father);
    }

    Person childd = new Person(mom, dad);
    childd.setName(child);
    childd.setDate(date);

    persons.add(childd);

}

private static Person getPerson(String person)
{
    for(Person p : persons)
    {
        if(p.getName().equals(person))
        {
            return p;
        }

    }

    return null;
}

}

这是我的person-class: 导入 java.util.ArrayList; 导入 java.util.List;

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;
}


}

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

【问题讨论】:

  • 如果机器人没有告诉您错误在哪里,请尝试自己执行整个程序,这样您可以获得更多关于错误位置的信息。
  • 好吧,我不知道要更改哪些信息,除了不会更改任何内容的名称。

标签: java arrays oop for-loop


【解决方案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]);
    ...

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


回答您的评论:

如果你看一下你可以看到的birth方法,参数mother和father可以是null或空字符串,因为它只是他们的名字,如果不存在同名的人,就会创建一个新的。如果这是正确的行为,我没有检查问题,但从代码来看是可能的。

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);

【讨论】:

  • 好吧,我添加了,但是机器人说“错误答案”。我尝试使用示例输入,效果很好。
  • 我更新了我的答案。并快速浏览了您需要解决的任务,似乎您没有完全阅读它。例如,您最多应该有 250 个输入,一个输入的最大 100 个字符长度等,这些都没有在您的代码中实现。由于您只询问了 ArrayIndexOutOfBounds 异常并且似乎已解决(您得到了错误的答案,因为您的其余代码不符合任务),我猜这个问题已经解决了。
  • 是的,但他们写道,你可以假设它,所以我不必在代码中修复它。我应该为这个问题创建一个新问题吗?
  • 您不再遇到异常,因此您的原始问题已解决。错误的答案可能意味着任何事情,所以这里不具体问。 (是的,给出了 100 个字符,对此感到抱歉)。也许花了很长时间?时间限制为 1 秒。但这不是猜谜游戏。如果您认为原始问题没有得到解答,请尝试对其进行编辑/改写,但前提是它仍连接到 ArrayIndexOutOfBounds 异常。否则我会建议提出一个新问题,因为这是一个不同的问题。
  • 那如果你接受答案就好了。祝你好运。
猜你喜欢
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多