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、数値を入力)が交差しています

誰かがこのテストケースを実行しようとして、このエラーにも遭遇したことがありますか?

4

2 に答える 2

3

jffp と JDK1.7 にはこのような問題があります。ソースを調べたところ、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 を使用しているときにバグが発生しました。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 に答える