0

私がプログラムした限り、問題なく動作するスクリプトがあります。そのスクリプト内には do-while ループがあり、その中にさらに 2 つの 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

例外メッセージがどこに表示されるかを気にするのはなぜですか? ユーザーは、例外からのデバッグ プリントやスタック トレースに直面することはありません。

通常、例外トレースと通常の出力は 2 つの異なる出力ストリーム (それぞれ System.err と System.out) に送信され、メッセージは必ずしも 2 つの間で同期されるとは限りません。flush()印刷後にストリームを -ing すると役立つ場合があります。とはいえ、例外が予想される場合は、コードを作成して予防的に回避するか、Java の例外処理でキャッチする必要があります。

于 2012-07-03T11:31:20.577 に答える
0
if (i < ImportFiles.importarray.size()) {
    do {
        numberline = ImportFiles.importarray.get(i);
        i = i + 1;
    } while (!numberline.startsWith(".Number"));
    //...

に 、 、およびのimportarray3 行が含まれているとします。で始まる場合。何が起こるか?aaafoobari0

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 に答える