2012-04-16 66 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()); 
        } 
       } 

该脚本将每天运行所以为了清除昨天的数据我不得不删除表中的所有内容,并再次重新插入所有的值。删除后,它开始建立一个新的内容数组。有两种方法可以解决这个问题,并且我正在寻找来自社区的反馈,哪种方式最好。一种方式是我做的到现在为止并试图捕捉人物34-40这在下面的例子中会产生A00000

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

另一种方法是跳过所有其他行,并找到只有线的方式,在它们中有“MOVING VOLUME”(行开头的时间戳发生变化,所以我想这样做会更困难)。

FOR循环中的某个简单的IF语句会阻止错误吗?例如:

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

给出哪条线/指令抛出异常的信息会给你更好的答案。 – SJuan76 2012-04-16 20:23:04

回答

6

当你调用cust.substring(34,40);,你需要确保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

YOu可以使用if语句,如您所建议的,以确保您的字符串足够长(这将是我的选择)。但另一种方法是将子串调用放在try/catch块中并捕获IndexOutOfBoundsException。 – 2012-04-16 21:53:47

+0

在这种情况下使用异常不是建议您指出的。 – assylias 2012-04-16 21:56:27