【问题标题】:Java methood split() not working with comma, array out of boundsJava methood split() 不能使用逗号,数组越界
【发布时间】:2015-12-29 03:24:36
【问题描述】:

我正在尝试分隔用户输入的地址字符串,该字符串以逗号分隔。例如,如果用户输入地址

"4367, 56th Avenue, Vancouver, BC, V4K1C3"

我想要值和数组

array ["4376", "56th Avenue", "Vancouver", "BC", "V4K1C3"]

使用索引 0 到 4。但是,在我的一个类中实现此功能时,当我将 array[1] 的值分配给变量时,我不断收到数组越界错误 - 好像一切都进入 0数组的索引。这是我写的一个 sn-p 来说明这个问题:

import java.util.Scanner;

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

  String fullAddress = input.next();

  String[] arr = fullAddress.split(",");

  System.out.println(arr[0]);
  System.out.println(arr[1]); //error java.lang.ArrayIndexOutOfBoundsException: 1
  System.out.println(arr[2]);
  System.out.println(arr[3]);
  System.out.println(arr[4]);


 }
}

这里出了什么问题?

【问题讨论】:

  • 你的调试器告诉你 fullAdress 包含什么?
  • ^ 这个。调试器会在几秒钟内解决这个问题;)

标签: java arrays indexing split


【解决方案1】:

问题是您使用的是next(),它使用<space> 作为分隔符。给定输入为:

4367, 56th Avenue, Vancouver, BC, V4K1C3

使用next(),你最终会得到fullAddress = "4367,"。拆分时你会得到arr = ["4367"],因此你会在arr[1] 得到异常。

请改用nextLine()

String fullAddress = input.nextLine();

【讨论】:

    【解决方案2】:

    您需要使用nextLine() 而不是next()。您还应该使用以下正则表达式来避免空格:

    String[] arr = fullAddress.split(",\\s+");
    

    【讨论】:

      【解决方案3】:

      问题在于next()

      String fullAddress = input.next();
      

      因为它只读取输入,而不是行尾或输入之后的任何内容。 您需要将其更改为

      String fullAddress = input.nextLine();
      

      【讨论】:

        【解决方案4】:
         String fullAddress = input.nextLine();
        
         String[] arr = fullAddress.split(",");
        
         for(String k : arr)
         System.out.println(k); //better approach to avoid out of bound exception
        

        【讨论】:

          【解决方案5】:

          使用nextLine() 而不是next()

          next() 只会返回空格之前的内容。

          nextLine() 在返回扫描仪后自动向下移动扫描仪 当前行。

          您的意见4367, 56th Avenue, Vancouver, BC, V4K1C3

          您的fullAddress 包含4367,,因此在split() 之后您只有一项,并且您正在尝试访问第二个元素,因此您将获得java.lang.ArrayIndexOutOfBoundsException: 1

          【讨论】:

            【解决方案6】:

            如果您使用带逗号的拆分,请不要忘记在每个标记上使用trim(),因为如果您有这样的内容:"4367, 56th Avenue, Vancouver, BC, V4K1C3",数组将如下所示:

            array ["4376", " 56th Avenue", " Vancouver", " BC", " V4K1C3"]
            

            没有trim()会有前导空格

            【讨论】:

            • 最好直接用适当的正则表达式分割,以避免之后需要trim()。看我的回答。
            猜你喜欢
            • 2019-05-10
            • 2013-04-02
            • 2013-08-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多