目前我正在研究一个程序,该程序解析一个文件并从每行中取出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());
}
}
这个脚本每天都会运行,所以为了清除昨天的数据,我必须删除表中的所有内容并重新重新插入所有值。删除后,它会开始构建一个新内容数组。我可以通过两种方式来解决这个问题,我正在寻找社区的反馈意见。一种方法是我现在正在做的方式并尝试捕获34-40字符,在下面的示例中将产生A00000
TMSS0000N-02:00:30将A00000卷移至NEXT
另一种方法是跳过所有其他行,只找到其中有“MOVING VOLUME”的行[行开头的时间戳改变,所以我想这样会更难]。
FOR循环中某处的简单IF语句会阻止错误吗?例如:
if (cust.length >= 34)
{
cust.substring(34,40);
}
else
{
cust.substring = "XXXXXX";
}
答案 0 :(得分:6)
当你致电cust.substring(34,40);
时,你需要确保cust.length >= 40
或它会抛出你得到的例外。请参阅javadoc for public String substring(int beginIndex, int endIndex)
:
抛出IndexOutOfBoundsException - 如果beginIndex为负数,或者endIndex大于此String对象的长度,或者beginIndex大于endIndex。