2012-04-16 4 views
0

현재 파일을 파싱하고 각 줄에서 34-40자를 가져 와서 데이터베이스의 테이블에 놓는 프로그램에서 작업하고 있습니다. 나는 미만 34 자 길이의 선으로 실행 시간, 내 프로그램이 오류를 뱉어 :Java : 범위를 벗어나는 특정 줄을 무시하려고합니다

WARNING: General Error:String index out of range: 40

내가 아직도 도움의 손길이 요구되는 자바에서 초보자입니다. 나는 테이블의 모든 내용을 삭제하고 다시 모든 값을 다시 삽입해야 어제의 데이터를 제거하기 위해, 그래서이 스크립트는 매일 실행됩니다

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()); 
        } 
       } 

: 여기 내 코드의 일부이다. 삭제 후, 새로운 내용의 배열을 만들기 시작합니다. 이 문제에 접근 할 수있는 방법은 두 가지가 있으며 어느 방법이 최선인지에 대한 의견을 커뮤니티에서 찾고 있습니다. 한 가지 방법은 내가 지금까지 일을하고 다른 모든 라인을 생략하고 오직 선을 발견하는 것입니다 다음 예 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

관련 문제