【问题标题】:java.lang.ArrayIndexOutOfBoundsException: 4java.lang.ArrayIndexOutOfBoundsException:4
【发布时间】:2018-12-06 06:09:23
【问题描述】:

我正在将值从制表符分隔的文本文件中提取到 groovy 中的列表中。但是我遇到了ArrayIndexOutOfBoundsException

代码

println("Reading File Contents")

def fullArray = new String[31721][4]
def availableArray = new String[1386][2]
def filteredFullArray = new String[1386][5]

String fileContents = new File('beliefs.txt').text
String availableContents = new File('available.txt').text

def count = 0

fileContents.eachLine { line ->

    String[] str
    str = line.split('\t')

    def subCount = 0
    for (subCount; subCount < str.length; subCount++) {
         fullArray[count][subCount] = str[subCount]
    }
    count++
}

beliefs.txt

1   Azerbaijan  hasOfficialLanguage Azerbaijani_language
2   Augustus    hasChild    Julia_the_Elder
3   Arthur_Aikin    isCitizenOf England
4   Arthur_Aikin    diedIn  London
5   Alexander_III_of_Russia isMarriedTo Maria_Feodorovna__Dagmar_of_Denmark_
6   Alexander_III_of_Russia hasChild    Nicholas_II_of_Russia
7   Alexander_III_of_Russia hasChild    Grand_Duke_Michael_Alexandrovich_of_Russia
8   Alexander_III_of_Russia hasChild    Grand_Duchess_Olga_Alexandrovna_of_Russia
9   Alexander_III_of_Russia hasChild    Grand_Duke_Alexander_Alexandrovich_of_Russia
10  Alexander_III_of_Russia hasChild    Grand_Duke_George_Alexandrovich_of_Russia
...
...
...
31719   Minqi_Li    isKnownFor  Chinese_New_Left
31720   Henry_Bates_Grubb   isKnownFor  Mount_Hope_Estate
31721   Thomas_Kuhn isKnownFor  Paradigm_shift  

运行它会给我以下错误。

捕获:java.lang.ArrayIndexOutOfBoundsException:4 java.lang.ArrayIndexOutOfBoundsException:4 在 extractBeliefs$_run_closure1.doCall(extractBeliefs.groovy:19) 在 extractBeliefs.run(extractBeliefs.groovy:12)

我知道发生上述错误的原因。但由于我的数组没有超过最后一个索引,并且错误显示在fileContents.eachLine { line -&gt; 行,所以我无法找到出错的地方。

在这方面的任何建议都将受到高度赞赏。

【问题讨论】:

  • 你在一行上有一个额外的标签。
  • 找到带有额外选项卡的行的一种方法是将文件以制表符分隔的形式导入 Excel,然后快速向下查看 E 列​​以查看文本的位置。
  • 谢谢。但问题是,它大约有 23000 行,因此,我正在研究一种方法来自动连接当前以制表符分隔且故意不应该如此的任何文本。
  • 您可以只增加fullArray 的第二个维度,这样它就足以存储在线上最多的字段。或者您可以将for 循环中的条件更改为subCount &lt; str.length &amp;&amp; subCount &lt; 4

标签: java arrays groovy indexoutofboundsexception filecontentresult


【解决方案1】:

您的初始错误来自这一行 (19):

fullArray[count][subCount] = str[subCount]

第 12 行只是在异常退出闭包时提升异常。这绝对表明您在一行上有一个额外的选项卡...出于调试目的,请在尝试将其加载到数组中之前尝试将该行打印到控制台。这将帮助您确定哪一行有错误。

【讨论】:

    【解决方案2】:

    尝试用空格分割

    str = line.split('\s+')
    

    而不是

    str = line.split('\t')
    

    【讨论】:

    • 似乎'\s+' 在 groovy 中无效,因为它给了我一个错误。编辑:如果您打算基于多个看起来合乎逻辑的空格进行拆分,我尝试使用'\\s+',但效果不佳
    【解决方案3】:

    更好的方法是先用单个空格替换所有多空格或制表符,然后再按单个空格分割。

    line = line.replace("\\s+/g", " ")
    str = line.split('\\s+')
    

    【讨论】:

    • 感谢您的回复。但是g 应该在/\s\s+/g 中是什么?它似乎给出了一个错误。我也将('\s+') 更改为('\\s+')
    • @Nayantara Jeyaraj /g,它将所有空白字符(空格、制表符、\r、\n、\v \f)替换为空格字符。全局搜索模式
    • 上述方法无效。但根据@Dawood 的说法,似乎有一些制表符空格,因此正在修改这些空格。似乎更容易
    猜你喜欢
    • 2018-09-06
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 2023-04-03
    • 2014-01-30
    相关资源
    最近更新 更多