0

現在、ファイルを解析し、各行から 34 ~ 40 文字を取り出してデータベースのテーブルにドロップするプログラムに取り組んでいますが、34 文字未満の行に遭遇するたびに、プログラムはこのエラーを吐き出します:

警告: 一般エラー: 文字列インデックスが範囲外です: 40

私はまだJavaの初心者なので、助けが必要です。ここに私のコードの一部があります:

try
            {
                fstream                             = new FileInputStream(filename);
                DataInputStream in                  = new DataInputStream(fstream);
                BufferedReader br                   = new BufferedReader(new InputStreamReader(in));
                PreparedStatement deleteFields      = null;
                String deleteTable                  = "DELETE FROM info WHERE VOLSER IS NOT NULL;";
                deleteFields                        = conn.prepareStatement(deleteTable);
                deleteFields.executeUpdate();
                deleteFields.close();
                logger.info(deleteTable);
                PreparedStatement updateFields      = null;
                String[] qmarks                     = new String[linenumber];

                //Adding data to the database
                for(int i = 0; i < linenumber; i++)
                {
                    String cust                 = in.readLine();
                    String subCust              = cust.substring(34,40);
                    qmarks[i]                   = subCust;
                    String updateString         = "REPLACE INTO info" + " (VOLSER) " + "VALUE ('" + (qmarks[i]) + "');";
                    logger.info(updateString);

                    try
                    {   
                        updateFields = conn.prepareStatement(updateString);
                        updateFields.executeUpdate();
                        updateFields.close();
                    }
                    catch (SQLException e)
                    {
                        logger.warning("Error:" + e.getMessage());
                    }
                }

このスクリプトは毎日実行されるため、昨日のデータを消去するには、テーブルのすべての内容を削除し、すべての値を再度挿入する必要があります。削除後、新しいコンテンツの配列の構築を開始します。これには 2 つの方法があります。どの方法が最適かについて、コミュニティからのフィードバックをお待ちしています。1 つの方法は、私が現在行っている方法であり、文字 34 ~ 40 をキャプチャしようとします。次の例では、A00000 が生成されます。

TMSS0000N-02:00:30 ボリューム A00000 を NEXT に移動

もう1つの方法は、他のすべての行をスキップして、「MOVING VOLUME」が含まれる行のみを見つけることです[行の先頭のタイムスタンプが変更されるため、この方法はより難しいと思いました]。

FOR ループのどこかで単純な IF ステートメントを使用すると、エラーが停止しますか? 例えば:

if (cust.length >= 34) 
{
     cust.substring(34,40);
}
else 
{
     cust.substring = "XXXXXX";
}
4

1 に答える 1

6

を呼び出すときは、取得した例外がスローされることcust.substring(34,40);を確認する必要があります。次のJavadoc をcust.length >= 40参照してください。public String substring(int beginIndex, int endIndex)

IndexOutOfBoundsException をスローします - beginIndex が負の場合、endIndex がこの String オブジェクトの長さより大きい場合、または beginIndex が endIndex より大きい場合。

于 2012-04-16T20:20:56.390 に答える