現在、ファイルを解析し、各行から 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";
}