从分割字符串访问值时ArrayOutOfIndex错误?

时间:2018-01-18 05:05:34

标签: java

我正在尝试按以下格式拆分字符串:AND 1 0

下面的逻辑方法使用.nextLine()接受字符串读取。

虽然我能够使用split方法和\\s+正则表达式将String拆分为数组,但每当我尝试访问数组的第二个值时,我都会遇到ArrayOutOfBound错误。

数组的第二个和第三个索引应包含值' 1'和' 2'分别 - 为什么会产生错误?

代码:

import java.util.*;

public class HelloWorld {

  public static int logic(String operator){
    String[] splitted = operator.split("\\s+");
    int val = 0;

    System.out.println(splitted.length); //Returns 3
    System.out.println(operator); //Returns AND 1 0
    System.out.println(splitted[0]); //Returns AND
    System.out.println(splitted[2]);  //ERROR
    return val;
  }

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int val = sc.nextInt(); //Error lies here, should be parsed as String.

        if(val == 1){
            int no_times = sc.nextInt();
            for(int i = 0 ; i < no_times; i++){
                System.out.println(logic(sc.nextLine()));
            }
            sc.close();
        }
    }
}

输入:

OR 1 1
AND 0 1
AND 1 0
OR 0 0
AND 0 0
OR 1 0
OR 0 1
OR 0 1
OR 1 1
OR 1 0

6 个答案:

答案 0 :(得分:1)

我已尝试运行您的代码,并且无错误地生成正确的输出。

然而,当我尝试用一​​些奇怪的字符替换“AND”,“1”,“0”之间的空格(可能在中文称为“SBC case”空格时,那些字符无法被\\ s +识别),它重现你的错误。所以我建议你检查“AND”,“1”,“0”之间是否有英文空格字符(可以被\\ s +识别)。

答案 1 :(得分:0)

试试这个。你得到那个错误,因为分割的长度小于你想要打印的长度。

第一种方法

    public static int logic(String operator){
        String[] splitted = operator.split("\\s+");
        int val = 0;
        System.out.println(operator); //Prints "AND 1 0"
        System.out.println("splitted length :: "+splitted.length()); 
        for (String str:splitted) {
            System.out.println(str); //Prints "AND"
        }
        // System.out.println(splitted[1]); //ERROR
        return val;
    }

第二种方法

    public static int logic(String operator){
        String[] splitted = operator.split("\\s+");
        int val = 0;
        System.out.println(operator); //Prints "AND 1 0"
        System.out.println("splitted length :: "+splitted.length()); 
        for (int i = 0; i<splitted.length();i++) {
            System.out.println(splitted[i]); //Prints "AND"
        }
        // System.out.println(splitted[1]); //ERROR
        return val;
    }

答案 2 :(得分:0)

我无法看到错误,您提供的代码段应该有效。虽然您可以使用以下内容来避免异常:

public static int logic(String operator){
        String[] splitted = operator.split("\\s+");
        int val = 0;
        System.out.println(operator); //Prints "AND 1 0"
        for(String split : splitted) {
            System.out.println(split);
        }
        return val;
      }

答案 3 :(得分:0)

你真的应该让你的代码更清晰,特别是在寻求帮助时。至于你的问题,这是Scanner is skipping nextLine() after using next() or nextFoo()?

的副本

Scanner#nextInt在输入后没有使用\ n,因此nextLine()只是接收\n

固定代码:

public static void main(String[] args) {
    System.out.print("Type 1 to continue: ");
    Scanner sc = new Scanner(System.in);
    int val = sc.nextInt();

    if(val == 1){
        System.out.print("\nHow many tests do you want to run? ");
        int no_times = sc.nextInt();
        sc.nextLine();
        for(int i = 0 ; i < no_times; i++){
            System.out.print("\nLogic: ");
            System.out.println(logic(sc.nextLine()));
        }
        sc.close();
    }
}

答案 4 :(得分:0)

nextLine方法正在从当前光标位置读取值直到行尾,并且它还包括分隔符。因此,当我们读取第一行输入时,它会占用这里的分隔符。例如,如果我们的第一个像1 1 OR 1 1

然后第一个nextInt返回1 然后第二个nextInt返回1 然后nextLine返回&#39;或1 1&#39;它的长度是4.我想,你的第一个输入是错的可能是你在那里遗漏了一些东西。 一个简单的解决方案就是更改代码的以下行。

String[] splitted = operator.split("\\s+");

String[] splitted = operator.trim().split("\\s+");

在拆分之前修剪。这样就删除了尾随空格。它可以解决你的问题。

答案 5 :(得分:-1)

完整输入首先包含两个整数。这两个整数由nextLine()而不是"Make sure that all repositories are available from your system and verify your setup by running manually: . sudo apt-get update " 解析,因此逻辑方法的给定参数没有接受完整的字符串 - 因此拆分失败。