【问题标题】:The Swedish Chef Translator瑞典厨师翻译
【发布时间】:2014-02-18 22:19:51
【问题描述】:

所以上下文是,我有一个 CS 项目,其中输入以单词或句子的形式,然后被翻译成来自 The Muppets 的瑞典厨师会说的话。我决定将输入作为一行字符串,并将该行发送到解析器,然后解析器将根据输入字母的翻译构建一个数组。发生变化的条件在其中定义。我得到的当前错误:(使用“INPUT”作为输入时)

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 1
    at java.util.ArrayList.rangeCheckForAdd(Unknown Source)
    at java.util.ArrayList.add(Unknown Source)
    at SwedishTranslator.parseString(SwedishTranslator.java:62)
    at SwedishTranslator.main(SwedishTranslator.java:12)

目前它应该只打印数组,我想担心事后的格式化。 代码:

对不起,文字墙,但我找不到问题的确切位置,我想我会在这里试一试。提前致谢。

【问题讨论】:

  • 您可能想了解如何使用调试器来逐步执行您的程序。此外,异常会准确告诉您是哪一行导致了错误。

标签: java parsing methods arraylist indexoutofboundsexception


【解决方案1】:

ind<=in.length() 走得太远了。

使用ind < in.length()ind <= in.length() - 1

【讨论】:

    【解决方案2】:

    错误出现在第 62 行,我认为在您的大 if else 部分中。

    在那里你有几个ind++ 电话。这会增加您在循环中使用的指针。因此,如果您的代码必须通过其中几个语句,它将超出数组索引。

    另外,正如 joval 所提到的,您在 for 循环中遇到了问题

    编辑

    ++ 一元运算符递增变量(--递减)。将 ++ 放在变量名 (x++) 之后将在评估前递增,其中 ++x 将在评估后递增。

    这是一个CS学生的常见测试题,所以我建议你对算子做更多的研究和实践。

    【讨论】:

    • 所以 in.charAt(ind++) 实际上会在 ind 上加 1,然后当它检查下一个条件时,它最终会检查出边界吗?我以为它只是比 ind 的计数多检查一个。
    【解决方案3】:

    您在这里犯了几个非常容易理解的初学者错误。我不会明确地修复你的代码,而是告诉你一些事情,如果在审查和编辑你的代码时考虑到这些事情,也将解决你的问题。

    当您尝试访问字符串中的越界项时,String.charAt http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#charAt(int) 的文档会引发错误。在调用 charAt 之前,请确保检查您没有试图超越字符串的长度!如果您当前正在“考虑”“INPUT”中的“T”并尝试查看接下来的两个字符,Java 会抱怨。

    其次,这更笼统(尽管它确实需要在上面的代码中修复); '++' 运算符并没有按照您的实际想法执行。当您这样做时:in.charAt(ind++)=='H',您可能认为您只是在检查下一个索引的值,但实际上您同时推进索引! '++' 运算符非常方便,但它有一个副作用,让很多初学者感到困惑:它将自身 + 1 分配给自身!这意味着如果您在“INPUT”中的“I”上并且在循环中的某个位置调用ind++ 一次,那么在循环的下一次迭代中您将在“P”上!当您看到“++”时,请记住您正在更改变量的值。

    祝你好运!

    【讨论】:

    • 谢谢!我已经有大约 3 个月没有编码了,所以我仍然在为下一门课程做准备。我感谢您的解释。
    猜你喜欢
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多