【问题标题】:Going out of Bounds while Attempting to Delimit and Split a Line尝试划界和分割线时出界
【发布时间】:2021-04-04 02:01:28
【问题描述】:

我必须将文件读入 arraylist,然后从 arrlist 中逐行读取,以便分隔命令(i 表示插入)和键(要插入的数字)。因为我正在建立一个跳过列表。我的文件由:

我 2173

我 2307

我 2405

我 1512

我 1783

我 60

编辑:&是的,每个插入命令旁边都有一个数字。

问题是我的程序突然超出以下行:

int key = Integer.parseInt(字母[1]);

为什么会发生这种情况?它以前成功地工作,但突然超出了界限,当我进行打印测试时,它也在文件行之间跳过了 1 行。 代码如下。谢谢。

错误:线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException:索引 1 在 SkipList.main(SkipList.java:103) 处超出长度 1 的范围

import java.io.*;
import java.util.*;
import java.lang.StringBuild

public class SkipList{
    
 public static void main(String[] args) throws IOException{
      
     String line; 
     
     File file = new File("src/in10.txt");
    
     Scanner in = new Scanner(file);  
  
    //Copying File content 
     ArrayList<String> arrList = new ArrayList<>(); 
                   
    // Populates array list with text file content        
    while(in.hasNextLine()) {
     arrList.add(in.nextLine());
     }
     
     for ( int i = 0; i < arrList.size(); i++){
    
      line = arrList.get(i); 
    // System.out.println(line); 

    //Splits Line with space delimiter into String Array
    String[] letter = line.split(" ");
    
    String command = letter[0];
    int key = Integer.parseInt(letter[1]); //ERROR occurs here?
        
    }
  
  } 
                                                                                                    
}

【问题讨论】:

  • 为什么会发生这种情况? - 您的数据不是您期望的格式。通过显示每一行文本(在进行拆分之前)进行一些基本调试,然后显示数组长度以验证拆分处理。
  • 我的建议是打印出letter.lengthletter 的每个元素;也可能是line。也许该行是空的?无论如何,查看实际值可能会有所启发。
  • 你确定每一行都有一个命令一个键吗?也许您不应该盲目访问letter[1],直到您确定letter[0] 是一个需要附带键的命令。
  • 您的数据文件中也很可能有一些垃圾非打印字符。运行调试器或至少添加一个 println 并将输入行转储到控制台会告诉你发生了什么。

标签: java delimiter


【解决方案1】:
// System.out.println(line); 

//Splits Line with space delimiter into String Array
String[] letter = line.split(" ");

你给了几个基本的建议:

  1. 显示线条
  2. 显示数组长度

所以代码应该是这样的:

System.out.println("(" + line ")"); 

//Splits Line with space delimiter into String Array
String[] letter = line.split(" ");
System.out.println(letter.length);

第一个 println() 会告诉你文件中是否有空行。

第二个 println() 将告诉您拆分是如何工作的。正如建议的那样,您可能在字符串中没有“”,而是一个不可打印的字符。

我们无法为您调试代码,因为我们无权访问您的文本文件。

【讨论】:

  • 嗨,这就是我发布文件确切内容的原因。除了命令“i”后跟一个空格和一个数字之外,没有任何内容。我确实显示了行和数组长度。与文件中的完全一样。
  • 这就是我发布文件确切内容的原因 - 不,你没有。您的帖子显示空行。如果您有空行,您的代码会出现不同的异常。我们无法判断您在命令和数字或其他不可打印字符之间是否真的有空格。 我确实显示了行和数组长度 - 如果每行得到“2”,那么你应该没有问题。发布您的调试输出。
  • 文件中没有空行。如果我可以发布它,我会的。文件没有问题。它是由我的教授制作的,它只包含我在上面发布的行,除了中间没有空行。我必须在这里做缩进,但谢谢。我只是删除问题并寻找其他地方。
  • 文件没有问题 - 我复制了您的数据并创建了一个文件。我复制了您的代码并使用我创建的文件进行了测试。它按预期工作,没有例外。所以你的代码确实确实有效。这意味着要么 1)您在论坛中发布的代码不是您正在测试的代码,要么 2)您文件中的数据无效。只有你能解决你的问题。
猜你喜欢
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 2017-10-27
  • 2019-04-20
  • 2021-07-31
  • 1970-01-01
相关资源
最近更新 更多