2016-01-07 36 views
1

我使用Duke進行記錄鏈接,並在基本測試中從CSVReader中得到此異常java.lang.ArrayIndexOutOfBoundsException:1000。公爵CSVReader ArrayIndexOutOfBoundsException

這是我的Java類:

Configuration config = ConfigLoader.load("resources/dukeConfiguration.xml"); 
    Processor proc = new Processor(config); 
    proc.addMatchListener(new PrintMatchListener(true, true, true, false, 
               config.getProperties(), 
               true)); 
    proc.link(); 
    proc.close(); 

而這一次是在配置文件:

<duke> 

<schema> 
    <threshold>0.7</threshold> 

    <property type="id"> 
     <name>ID</name> 
    </property> 

    <property> 
     <name>TITLE</name> 
     <comparator>no.priv.garshol.duke.comparators.Levenshtein</comparator> 
     <low>0.09</low> 
     <high>0.93</high> 
    </property> 
    <property> 
     <name>ARTIST</name> 
     <comparator>no.priv.garshol.duke.comparators.Levenshtein</comparator> 
     <low>0.04</low> 
     <high>0.73</high> 
    </property> 
</schema> 

<group> 
    <jdbc> 
     <param name="driver-class" value="com.mysql.jdbc.Driver" /> 
     <param name="connection-string" value="jdbc:mysql://localhost:3306/digitalmusic" /> 
     <param name="user-name" value="root" /> 
     <param name="password" value="root" /> 
     <param name="query" value="select * from inventory" /> 

     <column name="idsong" property="ID" /> 
     <column name="title" property="TITLE" /> 
     <column name="artist" property="ARTIST" /> 
    </jdbc> 
</group> 

<group> 
    <csv> 
     <param name="input-file" value="/home/mongo.csv" /> 
     <param name="header-line" value="false" /> 

     <column name="1" property="ID" /> 
     <column name="2" property="TITLE" /> 
     <column name="3" property="ARTIST" /> 
    </csv> 
</group> 

</duke> 

有人知道問題出在哪裏?

堆棧跟蹤:

Records: 0 

Records: 40000 

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1000 
    at no.priv.garshol.duke.utils.CSVReader.next(CSVReader.java:70) 
    at no.priv.garshol.duke.datasources.CSVDataSource$CSVRecordIterator.findNextRecord(CSVDataSource.java:170) 
    at no.priv.garshol.duke.datasources.CSVDataSource$CSVRecordIterator.next(CSVDataSource.java:198) 
    at no.priv.garshol.duke.datasources.CSVDataSource$CSVRecordIterator.next(CSVDataSource.java:111) 
    at no.priv.garshol.duke.Processor.linkRecords(Processor.java:362) 
    at no.priv.garshol.duke.Processor.link(Processor.java:319) 
    at no.priv.garshol.duke.Processor.link(Processor.java:298) 
    at no.priv.garshol.duke.Processor.link(Processor.java:285) 
    at duke.DukeCollecting.main(DukeCollecting.java:20) 
+0

你可以發佈堆棧跟蹤嗎? – mimimito

+0

隨堆棧跟蹤更新 –

+0

它在第一行之後記錄:0和記錄:40000. –

回答

1

OK,這裏是你的問題。

按照latest source posted @ GitHub,當你實例化一個新CSVReader,出現這種情況:

public CSVReader(Reader in, int buflen, String file) throws IOException { 
    this.buf = new char[buflen]; 
    this.pos = 0; 
    this.len = in.read(buf, 0, buf.length); 
    this.tmp = new String[1000]; 
    this.in = in; 
    this.separator = ','; // default 
    this.file = file; 

}

根據您的堆棧跟蹤,錯誤是發生在該塊:

if (escaped_quote) 
    tmp[colno++] = unescape(new String(buf, prev + 1, pos - prev - 1)); 
    else 
    tmp[colno++] = new String(buf, prev + 1, pos - prev - 1); 

問題是CSVReader colno大於比t的1000他以前分配的陣列容量,因此產生java.lang.ArrayIndexOutOfBoundsException

這些都是你的選擇恕我直言:

  • 選項1:獲取源(分叉項目),增加了tmp緩衝區,直到你的程序運行時沒有錯誤並重新編譯;或

  • 選項2:檢查GitHub的項目頁面,以查看是否有關於這個問題(或只需打開一個問題)任何懸而未決的問題,並找出是否有在文件中的任何格式不正確的信息,可能會導致array overflow

我建議選項2除非你是在趕時間。

祝你好運!

+0

是的,問題是colno限制爲1000。 –