0

就我编写的程序而言,我有一个运行良好的脚本。在该脚本中,我有一个 do-while 循环,其中还有两个 do-while 循环,一个提供给另一个。

为了清楚起见,我删除了一些代码:

StockArray.stockCodeArray();// creates stockcode array
FileArray.fileListArray();  // creates array of file names to input into
                            // ImportFiles
ImportFiles.importAscii();  // reads file. if debug: creates importarray

do {
    ObsHandler.obsPartsHandler(); // read part descriptions into temp
                                    // array
    ObsHandler.search();
} while (!endline.equals(null));

obsPartsHandler():

String numberline;
ObsHandler o1 = new ObsHandler("Part");
if (i < ImportFiles.importarray.size()) {
    do {
        numberline = ImportFiles.importarray.get(i); //editted here
        i = i + 1;
    } while (!numberline.startsWith(".Number"));

    i = i + 1; // set i to second line of part description
    do {
        i = i + 1; // set i to next line
    } while (!numberline.equals(""));

    if (i < ImportFiles.importarray.size()) {
        endline = ImportFiles.importarray.get(i);
        System.out.println(endline);
    }
}

所有变量都已初始化。search() 方法当前为空。

当我通过循环时,有一个我省略的打印流,这表明循环运行正常。

我遇到的问题是,当我运行程序时,我期望从 obsPartsHandler 中的 if 语句中得到的 OutOfBoundsException 在控制台上的位置是不可预测的。我想知道是否,但仍然假设,这是我做错了什么。

如果我删除了太多代码,请发表评论,我会重新添加。

例外:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 307, Size: 307
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at ams.ObsoletePartsHandler.org.ObsHandler.obsPartsHandler(ObsHandler.java:58)
at ams.ObsoletePartsHandler.org.ObsHandler.main(ObsHandler.java:35)
4

2 回答 2

0
if (i < ImportFiles.importarray.size()) {
    do {
        numberline = ImportFiles.importarray.get(i);
        i = i + 1;
    } while (!numberline.startsWith(".Number"));
    //...

假设importarray包含 3 行aaafoobar. 如果i开始于0. 会发生什么?

它将 linenumer 设置为aaa并测试它是否以 ".Number" 开头。然后将其设置为foo,将其设置为bar。现在该行仍未找到,因此i变为3,但没有第 4 行,因此抛出异常。(第一项的索引为 0,因此第 4 项的索引为 3。)

您可以为这 4 行代码创建一个函数来满足您的需要:

private int getLineStartsWith(List<String> list,String startsWith,int offset) {
    for (int k = offset; k < list.size(); k++)
        if (list.get(k).startsWith(starsWith);
             return k;//line found

    return -1;//line not found
}

-1如果在列表中找不到该行,则返回。那么你的函数可以写成:

i = getLineStartsWith(ImportFiles.importarray,".Number",i);
if (i == -1)
   'Not found'
于 2012-07-03T10:36:56.187 回答
0

你为什么担心异常消息出现在哪里呢?用户永远不应面对您的调试打印或异常的堆栈跟踪。

异常跟踪和常规打印通常发送到两个不同的输出流(分别为 System.err 和 System.out),消息不一定在两者之间同步。flush()- 打印到流后可能会有所帮助。也就是说,如果您期待异常,您可能应该编写代码以先发制人地避免它,或者使用 Java 的异常处理来捕获它。

于 2012-07-03T11:31:20.577 回答