2012-12-04 32 views
3

我想使用Java平面文件解析器(jffp),並試圖運行TestCase(JUnit)「LineFormatTest」,它位於src文件內部(並且在點擊一些內部文件「測試」)。 我得到的是這樣的錯誤:Java平面文件解析器(jffp)LineFormatTest

org.sadun.text.ffp.FieldDefinitionException: Programming error: the fields field_1_1 (from position 0 to position5, length 5, type numeric) and field_1_1 (from position 0 to position5, length 5, type numeric) intersect

有沒有人嘗試運行該測試用例和整個這個錯誤絆倒呢?

回答

3

我對jffp和JDK1.7有這樣的麻煩。我調查了一些資料,發現oracle修正了JDK1.7中TreeSet中使用的TreeMap的一些實現,因此jffp將字段定義添加到了set中,但是新實現的map調用比較了第一個元素與其自身和比較器實現的比較方法jffp包含字段元素位置的檢查,如果位置相同則拋出「編程異常」。如果你看看異常描述,你會看到它比較相同的字段。因此,如果你使用jdk1.7,那麼我不會看到任何輕量級的解決方案,因爲擺脫了jffp或jdk1.7(回到1.6)。

+0

謝謝@salvezza。你爲我節省了很多時間。你對其他Java1.7兼容的fixedformat解析器有什麼建議嗎? – lava

+0

不,但這裏有一些列表https://code.google.com/p/flapjack/wiki/OtherFileParsers – salvezza

+0

謝謝@salvezza,你發現無論如何通過修改jffp源代碼來修復它? – Don

2

我剛剛遇到了使用jdk1.7.0_55和jffp時的錯誤。 在Java 7中,只要將第一個元素添加到TreeSet中,就會調用比較器。因此,第一個FieldInfo實例(o1)與自身進行比較(o2); o1和o2明顯相交。

這裏是快速和骯髒的解決方案,我已經成功地測試:

  1. 下載jffp在SourceForge源代碼:http://sourceforge.net/projects/jffp/

  2. 採取LineFormat.java文件,並將其複製中您的項目中的org.sadun.text.ffp包。

  3. 現在,修改addFieldInfo私人方法 並添加狀態到f1.intersects(F2)測試,以確保一個字段不針對其自身測試交點(F1 = F2!):

    private void addFieldInfo(int physicalLine, FieldInfo info) { 
         if (physicalLine > currentPhysicalLine) 
          currentPhysicalLine = physicalLine; 
         final Integer pl = new Integer(physicalLine); 
         SortedSet l = (SortedSet) fieldsByLine.get(pl); 
         if (l == null) { 
          l = new TreeSet(new Comparator() { 
          public int compare(Object o1, Object o2) { 
           FieldInfo f1 = (FieldInfo) o1; 
           FieldInfo f2 = (FieldInfo) o2; 
           // fields must not intersect 
           if ((f1 != f2) 
             && f1.intersects(f2)) 
            throw new FieldDefinitionException(
             "Programming error: the fields " 
               + f1 
               + " and " 
               + f2 
               + " intersect"); 
           return f1.start - f2.start; 
    
          } 
          }); 
          fieldsByLine.put(pl, l); 
         } 
         l.add(info); 
    } 
    
  4. 編譯和測試。

我打算聯繫開發人員。也許他可以構建一個正式版本來修復這個bug。