2012-04-16 2 views
0

現在、私はファイルを解析し、各行から34-40文字を取り出してデータベースのテーブルにドロップするプログラムに取り組んでいますが、私は以下の34文字の長さのラインに実行する時は、私のプログラムは、このエラーを吐く:Java:範囲外の特定の行を無視して検索する

WARNING: General Error:String index out of range: 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つありますが、どの方法が最良かというコミュニティからのフィードバックを探しています。一つの方法は、私が今やっている方法であり、以下の例では、他の方法は、他のすべての行をスキップすることと、その行だけを見つけるだろうA00000

TMSS0000N-02:00:30 Moving Volume A00000 to NEXT

をもたらすであろう文字34-40をキャプチャしようそれらの中に「移動量」があるとします(行頭のタイムスタンプが変化するので、この方法はもっと難しいと思いました)。

FORループのどこかの単純なIF文でエラーが止まるのですか?たとえば:あなたはcust.substring(34,40);を呼び出すと

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

例外をスローする情報を与えると、より良い回答が得られます。 – SJuan76

答えて

6

、あなたはcust.length >= 40か、それはあなたが得る例外がスローされますことを確認する必要があります。 javadoc for public String substring(int beginIndex, int endIndex)

Throws IndexOutOfBoundsException - if the beginIndex is negative, or endIndex is larger than the length of this String object, or beginIndex is larger than endIndex.

+0

あなたは、あなたの文字列が(私の選択である)十分に長いことを確認するために、あなたが示唆するように、if文を使用することができます。しかし、もう一つの方法は、サブストリングコールをtry/catchブロックに置き、IndexOutOfBoundsExceptionをキャッチすることです。 –

+0

そのような場合の例外の使用はお勧めできません。 – assylias

関連する問題