3

我想使用 Java Flat File Parser (jffp) 并尝试运行 src 文件内的 TestCase (JUnit)“LineFormatTest”(在文件“test”内单击一些之后)。我得到的是这个错误:

org.sadun.text.ffp.FieldDefinitionException:编程错误:字段 field_1_1(从位置 0 到位置 5,长度 5,键入数字)和 field_1_1(从位置 0 到位置 5,长度 5,键入数字)相交

有没有人尝试运行这个 TestCase 并偶然发现了这个错误?

4

2 回答 2

3

我在 jffp 和 JDK1.7 上遇到了这样的麻烦。我调查了来源,发现oracle纠正了在JDK1.7的TreeSet中使用的TreeMap的一些实现,因此jffp将字段定义添加到集合中,但是map的新实现调用了第一个元素的比较方法,并在其中实现了比较器jffp 包含对字段元素位置的检查,如果位置相同,则会引发“编程异常”。如果您查看异常描述,您会发现它比较了相同的字段。

因此,如果您也使用 jdk1.7,那么我看不到任何轻松的解决方案可以摆脱 jffp 或 jdk1.7(回到 1.6)。

于 2013-03-01T09:43:54.933 回答
2

刚刚在使用jdk1.7.0_55和jffp的时候遇到了这个bug。在 Java 7 中,只要将第一个元素添加到 TreeSet,就会调用比较器。因此,第一个 FieldInfo 实例 (o1) 与自身 (o2) 进行比较;o1 和 o2 明显相交。

这是我成功测试过的快速而肮脏的解决方案:

  1. 在 sourceforge下载jffp源代码:http: //sourceforge.net/projects/jffp/

  2. 获取LineFormat.java文件并将其复制到项目的org.sadun.text.ffp包中。

  3. 现在修改addFieldInfo私有方法并将(f1 != f2)条件添加到f1.intersects(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. 编译和测试。

我要联系开发商。也许他可以建立一个官方版本来修复这个错误。

于 2014-06-02T15:08:14.327 回答