1

ArrayIndexOutOfBoundsException在 Java中获取字符串输入时,我得到了一个Java。请帮我。这是我的代码:我编辑了我的代码以使用拆分:它说

线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 1 at solution2.Solution.main(Solution.java:27)

public class Solution {

 static String search;

 public static void main(String[] args){

   String[] fn,ln,tp;
  boolean[] isSet;
 Scanner sc=new Scanner(System.in);      
 int no=sc.nextInt();

 String[][] temp=new String[no][3];
 fn=new String[no];
  ln=new String[no];
   tp=new String[no];
   isSet=new boolean[no];
   boolean flag=false;

     for(int i=0;i<no;i++){
   temp[i]=sc.nextLine().split(":");
   fn[i]=temp[i][0];
   ln[i]=temp[i][1];
   tp[i]=temp[i][2];
   isSet[i]=true;

     }

       System.out.println(temp.length);

      search=sc.nextLine();
4

4 回答 4

1

此行发生异常:

ln[i] = temp[i][1];

所以看起来

temp[i] = sc.nextLine().split(":");

在 -delimited 字符串中没有收到足够的标记:来创建String大小为 3 的数组。

您需要确保temp[i].length == 3您可以分配这些令牌。

有效输入的示例(注意:没有换行符)是:

1 test:foo:bar
于 2012-10-20T15:31:29.047 回答
0

我插入 sc.nextLine()。低于 int no = sc.nextInt(); 线。

导入 java.util.Scanner;

公共类解决方案{

static String search;

public static void main(String[] args) {

    String[] fn, ln, tp;
    boolean[] isSet;
    Scanner sc = new Scanner(System.in);
    int no = sc.nextInt();
    sc.nextLine(); // **********

    String[][] temp = new String[no][3];
    fn = new String[no];
    ln = new String[no];
    tp = new String[no];
    isSet = new boolean[no];
    boolean flag = false;

    for (int i = 0; i < no; i++) {
        temp[i] = sc.nextLine().split(":");
        fn[i] = temp[i][0];
        ln[i] = temp[i][1];
        tp[i] = temp[i][2];
        isSet[i] = true;

    }

    System.out.println(temp.length);

    search = sc.nextLine();
}

}

于 2012-10-20T15:47:51.940 回答
0

当您访问从创建的数组上不存在的索引时,会发生 ArrayIndexOutOfBoundsException split(":")

在这段代码中,temp[i]不能确保在索引 0、12 处具有值,因为如果nextLine()是诸如“狗”之类的东西,则没有冒号字符可以拆分。

temp[i]=sc.nextLine().split(":");
fn[i]=temp[i][0];
ln[i]=temp[i][1];
tp[i]=temp[i][2];

要解决此问题,您应该在尝试访问它之前验证该数组确实具有索引。

temp[i]=sc.nextLine().split(":");
if (temp[i].length >= 3) {
    fn[i]=temp[i][0];
    ln[i]=temp[i][1];
    tp[i]=temp[i][2];
}
于 2012-10-20T15:31:53.330 回答
0

你的问题是,sc.nextLine() 在你按下 [Enter] 后返回新行字符串(例如“\n”)。第二次是等你输入。请参阅Java String Scanner 输入不等待信息,直接移至下一条语句。如何等待信息?

在您的情况下,尝试在处理之前调用 sc.nextLine() :

sc.nextLine()
temp[i]=sc.nextLine().split(":");

编辑:你是对的,你必须在 nextInt() 之后插入它,因为 nextLine() 会消耗完整的行。

于 2012-10-20T15:34:52.810 回答