【问题标题】:Basic home work question what am I doing wrong基本的家庭作业问题我做错了什么
【发布时间】:2009-12-30 23:37:07
【问题描述】:
/* Method: findName() */
/**
 * Finds the name of the entry and sets it to the name variable.
 */
    private void findName(String line){
        end = line.indexOf(" ");
        name = line.substring(0,end);
    }

/* Method: findDecades() */
/**
 * Finds the name of the entry and sets it to the name variable.
 */
    private void findDecades(String line){
        for(int i = 0; i<NDECADES; i++){
            int start = end + 1;
            end = line.indexOf(" ",start);
            String decadeTemp = line.substring(start, end);
            data[i] = Integer.parseInt(decadeTemp);
        }
    }

行如下所示:

Sam 58 69 99 131 168 236 278 380 467 408 466

当我运行代码时,第一个方法运行良好,但是当它到达该行时会引发错误异常:

            String decadeTemp = line.substring(start, end);

编辑:

抛出的错误是:

抛出新的 StringIndexOutOfBoundsException(endIndex - beginIndex);

【问题讨论】:

  • 如果您的代码抛出异常,如果不是整个堆栈跟踪,向我们提供所抛出异常的确切名称和消息会很有帮助。

标签: java


【解决方案1】:

添加另一行

        end = line.indexOf(" ",start);
        System.out.println("Doing substring of "+start+" to "+end);  // new line
        String decadeTemp = line.substring(start, end);

这应该很明显。 我猜end是-1,表示你没有找到空格,NDECADES太大了。

【讨论】:

  • 要考虑的另一件事:每一行是否都以空格结尾?它应该以空格结尾吗?您的程序将如何处理其中包含错误数量的整数或意外在它们之间有多个空格而不是一个空格的行。如果分配允许,您可能只想使用扫描仪。
  • +1 建议添加调试行,这样他们就可以自己看到错误,而不仅仅是让我们告诉他是什么。
【解决方案2】:

我怀疑(没有进一步的信息)你在这段时间里用完了你的字符串的结尾

line.substring(start, end);

所以你的边界条件不正确。我会打印出开始/结束值并从中确定出了什么问题。顺便说一句,我强烈建议您在此类问题中发布您获得的异常/堆栈跟踪。

更进一步,您可能会发现通过使用String.split(" ") 并遍历结果数组更容易。这往往不太容易出错,因为您可以只在数组中使用 for 循环,而不必跟踪开始和结束品脱(我总是错了,因为它的价值)。

(因为这是作业,我假设输入字符串格式正确。否则您将不得不满足各种输入,并且需要更强大的解决方案)

【讨论】:

  • 已经有一种方法可以让计算机在您的程序抛出意外异常时向您显示相关信息:它被称为调试器。 :-)
【解决方案3】:

如果line 中没有空格怎么办?或者如果从start 开始没有空格怎么办?

【讨论】:

    【解决方案4】:

    您可能想看看 String 上的其他一些方法,这些方法可以使这更简单(想到String.split())。

    【讨论】:

      【解决方案5】:

      解决的问题 NDECADES 是一个空格太大。

      【讨论】:

        【解决方案6】:

        要自己开始寻找问题,您应该查看String#indexOfString#substring 的Javadoc,尤其是在边界情况下会发生什么(比如什么也没找到,等等)。

        【讨论】:

          【解决方案7】:

          您需要做一些检查,例如

          if (start > 0 && end > 0 && end < length).
          

          您还需要检查decadeTemp 是否为数字。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-04
            • 2016-08-01
            • 2023-03-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多