ArrayIndexOutOfBoundsException对阵列中的Split String

时间:2014-05-12 01:04:21

标签: java string

所以我在UVa在线问题判断上遇到了一些问题,但是在相关性问题上,我继续得到一个ArrayIndexOutOfBoundsException。要理解代码,请参阅problem.

import java.util.Arrays;
import java.util.Scanner;

public class Main {

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    int t = scan.nextInt();
    int sum = 0;
    for (int i = 0; i <= t; i++){
        String d = scan.nextLine();
        if (d.equals("report")) {
            System.out.println(sum);
        } else {
            String[] parts = d.split(" ");
            int z = Integer.parseInt(parts[1]);
            sum+=z;
        }
    }
}
}

错误消息是:

reportException in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at Main.main(Main.java:16)

我正在使用给出的示例输入。

编辑: 我已经尝试在代码中添加了println语句,并发现该数字未被读取。我想了解原因。

2 个答案:

答案 0 :(得分:0)

错误消息表示数组parts的长度小于2,有时 这意味着变量d始终包含字符串 BLANK SPACE ,“”,您拆分的内容。

试试这段代码:

import java.util.Arrays;
import java.util.Scanner;

public class Main {

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    int t = scan.nextInt();
    int sum = 0;
    for (int i = 0; i <= t; i++){
        String d = scan.nextLine();
        if (d.equals("report")) {
            System.out.println(sum);
        } else {
            String[] parts = d.split(" ");
            /*
             * Add IF statement,
             */
            if (parts.length() > 1) {
                int z = Integer.parseInt(parts[1]);
                sum+=z;
            }

        }
    }
}
}

答案 1 :(得分:0)

好吧,在我的机器上乱搞一下后,我想我发现了至少可能是问题的一部分。问题是,我不确定准确的输入是什么,所以我将在我的机器上工作。

所以你启动你的程序,它等待这一行的提示:

int t = scan.nextInt();

输入整数,程序按预期继续:

Input: 100 // Then press enter to continue

解析输入,现在t设置为100。

然后,当您的程序进入for循环时,会遇到以下行:

String d = scan.nextLine();

但由于某种原因,程序不等待输入! (或者至少它不在我的机器上)

我认为问题出在这里:

Input: 100 // Then press enter to continue
                   ^^^^^^^^^^^

我认为您的输入是真的

Input: 100\n
          ^^

当您按Enter键时,该字符(Windows上为\r\n)是输入的内容。这是一个换行符,告诉控制台转到下一行。

因此,我认为发生的是:

Input: 100\n

扫描程序解析100\n留在输入流中

然后在nextLine()调用时,扫描程序在输入流上看到\n,表示行尾,因此它认为您已输入整行!因为它认为你的输入只是换行符,它返回一个空字符串,因为你的“输入”是一个空字符串和换行符。然后你的程序按空格分割换行符,正确地返回一个包含单个元素的数组,然后你的程序在访问越界索引时会立即崩溃。

更好的方法是首先读取整行并解析整数,这样扫描仪就不会先于自己,如下所示:

int t = Integer.parseInt(scan.nextLine());

正如警告:这是我能够在我的机器上使用OP代码时提出的。我无法得到parts中唯一的元素是"donate"的情况。随着我获得更多信息,我会进一步更新。