0

SAX の使用中に Java で奇妙な動作が発生します。値が設定されていますが、出力の toString メソッドでデフォルト値に戻ります。これは本当に珍しいようです。私はコードを調べて、変数のメモリ アドレスを出力しました。すべてが正しい順序で行われ、正しく行われているように見えます。他のデシリアライズされた XML 要素は問題ないので、解決できません。

私のシステムは次のように機能します。ユーザーが属性ヘルパーと要素ハンドラーを定義する抽象メソッドを持つクラスがあります。要素ハンドラーはサブ XML 要素に基づいてサブクラスの生成を処理しますが、属性ハンドラーはコンストラクターから属性リストを受け取り、属性ヘルパーを介してこれを使用して、属性ヘルパーに実装された抽象メソッドを介してフィールドを設定します。

問題のあるクラスは次のとおりです。

package kokuks.flowmon;

import kokuks.flowmon.FlowmonParser.Handler;

import org.xml.sax.Attributes;

public class FlowProbeFlowStats extends FlowmonParserElement {
    protected final FlowProbe parent;
    protected int flowId = 0;
    protected int packets = 0;
    protected int bytes = 0;
    protected long delayFromFirstProbeSum = 0;
    protected boolean set = false;

    /**
     * @param handler
     * @param parent
     * @param uri
     * @param localName
     * @param qName
     * @param attributes
     */
    FlowProbeFlowStats(Handler handler, FlowProbe parent, String uri, String localName, String qName, Attributes attributes) {
        super(handler, parent, uri, localName, qName, attributes);
        this.parent = parent;
    }

    /**
     * @return the parent
     */
    public FlowProbe getParent() {
        return parent;
    }

    /* (non-Javadoc)
     * @see kokuks.flowmon.FlowmonParserElement#getXMLName()
     */
    @Override
    protected String getXMLName() {
        return "FlowStats";
    }

    /* (non-Javadoc)
     * @see kokuks.flowmon.FlowmonParserElement#createAttributeHandlers()
     */
    @Override
    protected IAttributeHandler[] createAttributeHandlers() {
        return new IAttributeHandler[] {
            new AttributeHandler("flowId") {
                @Override
                public void perform(String argValue) {
                    System.out.println("AH flowId: " + argValue);
                    flowId = Integer.parseInt(argValue);
                    set = true;
                }
            },
            new AttributeHandler("packets") {
                @Override
                public void perform(String argValue) {
                    System.out.println("AH packets: " + argValue);
                    packets = Integer.parseInt(argValue);
                    set = true;
                }
            },
            new AttributeHandler("bytes") {
                @Override
                public void perform(String argValue) {
                    System.out.println("AH bytes: " + argValue);
                    bytes = Integer.parseInt(argValue);
                    set = true;
                }
            },
            new AttributeHandler("delayFromFirstProbeSum") {
                @Override
                public void perform(String argValue) {
                    System.out.println("AH delayFromFirstProbeSum: " + argValue);
                    delayFromFirstProbeSum = Long.parseLong(argValue.substring(0, argValue.length() - 2));
                    set = true;
                }
            }
        };
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "FlowStats/" + super.toString() + "[flowId: " + flowId + ", packets: " + packets +
        ", bytes: " + bytes + ", delayFromFirstProbeSum: " + delayFromFirstProbeSum + "]";
    }
}

また、属性が検索され、関連する実装メソッドが呼び出されるデバッグ出力もいくつかあります。

    if (this instanceof FlowProbeFlowStats) {
        System.out.println("ahaaaa1:: " + this.toString());
    }

    IAttributeHandler[] ahandlers = createAttributeHandlers();

    if (ahandlers != null) {
        Map<String, IAttributeHandler> attributeHandlers = new HashMap<String, IAttributeHandler>(ahandlers.length);
        for (IAttributeHandler ah : ahandlers) {
            attributeHandlers.put(ah.getName(), ah);
        }

        for (int i = 0; i < attributes.getLength(); i++) {
            IAttributeHandler ah = attributeHandlers.get(attributes.getQName(i));
            if (ah == null) {
                throw new IllegalStateException("Attribute helper not found in qName: " + qName +  " for attrib with localName: " + attributes.getLocalName(i) + ", qname*: " + attributes.getQName(i));
            }

            try {
                ah.perform(attributes.getValue(i));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    if (this instanceof FlowProbeFlowStats) {
        System.out.println("ahaaaa2:: " + this.toString());
    }

とにかく、ここに出力があります:

ahaaaa1:: FlowStats/kokuks.flowmon.FlowProbeFlowStats@89cd21[flowId: 0, packets: 0, bytes: 0, delayFromFirstProbeSum: 0]
AH flowId: 1
AH packets: 5
AH bytes: 333
AH delayFromFirstProbeSum: 50274395ns
ahaaaa2:: FlowStats/kokuks.flowmon.FlowProbeFlowStats@89cd21[flowId: 1, packets: 5, bytes: 333, delayFromFirstProbeSum: 50274395]
ahaaaa1:: FlowStats/kokuks.flowmon.FlowProbeFlowStats@849f16[flowId: 0, packets: 0, bytes: 0, delayFromFirstProbeSum: 0]
AH flowId: 2
AH packets: 5
AH bytes: 333
AH delayFromFirstProbeSum: 50274395ns
ahaaaa2:: FlowStats/kokuks.flowmon.FlowProbeFlowStats@849f16[flowId: 2, packets: 5, bytes: 333, delayFromFirstProbeSum: 50274395]
ahaaaa1:: FlowStats/kokuks.flowmon.FlowProbeFlowStats@825c9d[flowId: 0, packets: 0, bytes: 0, delayFromFirstProbeSum: 0]
AH flowId: 3
AH packets: 5
AH bytes: 1082
AH delayFromFirstProbeSum: 0ns
ahaaaa2:: FlowStats/kokuks.flowmon.FlowProbeFlowStats@825c9d[flowId: 3, packets: 5, bytes: 1082, delayFromFirstProbeSum: 0]
ahaaaa1:: FlowStats/kokuks.flowmon.FlowProbeFlowStats@1577d9b[flowId: 0, packets: 0, bytes: 0, delayFromFirstProbeSum: 0]
AH flowId: 4
AH packets: 4
AH bytes: 762
AH delayFromFirstProbeSum: 0ns
ahaaaa2:: FlowStats/kokuks.flowmon.FlowProbeFlowStats@1577d9b[flowId: 4, packets: 4, bytes: 762, delayFromFirstProbeSum: 0]
ahaaaa1:: FlowStats/kokuks.flowmon.FlowProbeFlowStats@8097e5[flowId: 0, packets: 0, bytes: 0, delayFromFirstProbeSum: 0]
AH flowId: 2
AH packets: 5
AH bytes: 333
AH delayFromFirstProbeSum: 0ns
ahaaaa2:: FlowStats/kokuks.flowmon.FlowProbeFlowStats@8097e5[flowId: 2, packets: 5, bytes: 333, delayFromFirstProbeSum: 0]
ahaaaa1:: FlowStats/kokuks.flowmon.FlowProbeFlowStats@745c78[flowId: 0, packets: 0, bytes: 0, delayFromFirstProbeSum: 0]
AH flowId: 4
AH packets: 4
AH bytes: 762
AH delayFromFirstProbeSum: 40615996ns
ahaaaa2:: FlowStats/kokuks.flowmon.FlowProbeFlowStats@745c78[flowId: 4, packets: 4, bytes: 762, delayFromFirstProbeSum: 40615996]
ahaaaa1:: FlowStats/kokuks.flowmon.FlowProbeFlowStats@162e843[flowId: 0, packets: 0, bytes: 0, delayFromFirstProbeSum: 0]
AH flowId: 1
AH packets: 5
AH bytes: 333
AH delayFromFirstProbeSum: 0ns
ahaaaa2:: FlowStats/kokuks.flowmon.FlowProbeFlowStats@162e843[flowId: 1, packets: 5, bytes: 333, delayFromFirstProbeSum: 0]
ahaaaa1:: FlowStats/kokuks.flowmon.FlowProbeFlowStats@7e9dfc[flowId: 0, packets: 0, bytes: 0, delayFromFirstProbeSum: 0]
AH flowId: 3
AH packets: 5
AH bytes: 1082
AH delayFromFirstProbeSum: 51335996ns
ahaaaa2:: FlowStats/kokuks.flowmon.FlowProbeFlowStats@7e9dfc[flowId: 3, packets: 5, bytes: 1082, delayFromFirstProbeSum: 51335996]
[kks-j~KokuKS~/Names] fmxml:FlowMonitor[FlowStats[Flow[flowID: 1,timeFirstTxPacket: 1011735011,timeLastTxPacket: 1343457103,timeFirstRxPacket: 1021768610,timeLastRxPacket: 1353490702,delaySum: 50274395,jitterSum: 212800,lastDelay: 10033599,txBytes: 333, rxBytes: 333,txPackets: 5,rxPackets: 5,lostPackets: 0,timesForwarded: 0],Flow[flowID: 2,timeFirstTxPacket: 1015259481,timeLastTxPacket: 1543226881,timeFirstRxPacket: 1025293080,timeLastRxPacket: 1553260480,delaySum: 50274395,jitterSum: 212800,lastDelay: 10033599,txBytes: 333, rxBytes: 333,txPackets: 5,rxPackets: 5,lostPackets: 0,timesForwarded: 0],Flow[flowID: 3,timeFirstTxPacket: 1021768610,timeLastTxPacket: 1332941904,timeFirstRxPacket: 1031802209,timeLastRxPacket: 1343457103,delaySum: 51335996,jitterSum: 481600,lastDelay: 10515199,txBytes: 1082, rxBytes: 1082,txPackets: 5,rxPackets: 5,lostPackets: 0,timesForwarded: 0],Flow[flowID: 4,timeFirstTxPacket: 1025293080,timeLastTxPacket: 1332969282,timeFirstRxPacket: 1035326679,timeLastRxPacket: 1343226881,delaySum: 40615996,jitterSum: 291200,lastDelay: 10257599,txBytes: 762, rxBytes: 762,txPackets: 4,rxPackets: 4,lostPackets: 0,timesForwarded: 0]],Ipv4FlowClassifier[Flow[flowId: 4, sourceAddress: 10.1.0.1, destinationAddress: 10.1.0.2, protocol: 6],Flow[flowId: 3, sourceAddress: 10.1.0.1, destinationAddress: 10.1.1.2, protocol: 6],Flow[flowId: 2, sourceAddress: 10.1.0.2, destinationAddress: 10.1.0.1, protocol: 6],Flow[flowId: 1, sourceAddress: 10.1.1.2, destinationAddress: 10.1.0.1, protocol: 6]],FlowProbes[FlowProbe[index: 0, stats: <FlowStats/kokuks.flowmon.FlowProbeFlowStats@89cd21[flowId: 0, packets: 0, bytes: 0, delayFromFirstProbeSum: 0],FlowStats/kokuks.flowmon.FlowProbeFlowStats@849f16[flowId: 0, packets: 0, bytes: 0, delayFromFirstProbeSum: 0],FlowStats/kokuks.flowmon.FlowProbeFlowStats@825c9d[flowId: 0, packets: 0, bytes: 0, delayFromFirstProbeSum: 0],FlowStats/kokuks.flowmon.FlowProbeFlowStats@1577d9b[flowId: 0, packets: 0, bytes: 0, delayFromFirstProbeSum: 0]>],FlowProbe[index: 1, stats: <FlowStats/kokuks.flowmon.FlowProbeFlowStats@8097e5[flowId: 0, packets: 0, bytes: 0, delayFromFirstProbeSum: 0],FlowStats/kokuks.flowmon.FlowProbeFlowStats@745c78[flowId: 0, packets: 0, bytes: 0, delayFromFirstProbeSum: 0]>],FlowProbe[index: 2, stats: <FlowStats/kokuks.flowmon.FlowProbeFlowStats@162e843[flowId: 0, packets: 0, bytes: 0, delayFromFirstProbeSum: 0],FlowStats/kokuks.flowmon.FlowProbeFlowStats@7e9dfc[flowId: 0, packets: 0, bytes: 0, delayFromFirstProbeSum: 0]>]]]

メモリの値に注意してください。これはかなり奇妙です。(変換されたルート XML 要素からの) toString 出力全体が最後の行にあります。

とにかく、助けてくれてありがとう、
クリス

編集:0ではなく、変数にいくつかの異なるデフォルト値を設定しました:

protected final FlowProbe parent;
protected int flowId = 1000;
protected int packets = 1000;
protected int bytes = 1000;
protected long delayFromFirstProbeSum = 1000;
protected boolean set = false;

そして、ここに設定中の結果があります:

ahaaaa1:: FlowStats/kokuks.flowmon.FlowProbeFlowStats@1156508[flowId: 0, packets: 0, bytes: 0, delayFromFirstProbeSum: 0]
kokuks.flowmon.FlowProbeFlowStats@1156508: AH flowId: 4
kokuks.flowmon.FlowProbeFlowStats@1156508: AH packets: 5
kokuks.flowmon.FlowProbeFlowStats@1156508: AH bytes: 1082
kokuks.flowmon.FlowProbeFlowStats@1156508: AH delayFromFirstProbeSum: 0ns
ahaaaa2:: FlowStats/kokuks.flowmon.FlowProbeFlowStats@1156508[flowId: 4, packets: 5, bytes: 1082, delayFromFirstProbeSum: 0]

そのため、最初は奇妙なことが起こっています。値は 1000 ではなく 0 です。非常に奇妙です。最終的な出力になると、出力されるオブジェクトの値は 0 (フィールドのデフォルトの初期値) ではなく 1000 になります。

Edit2:ヘッダーに次のものがあります。

protected int countdown = 4;

属性が設定されると減少します。例は次のとおりです。

        new AttributeHandler("packets") {
            @Override
            public void perform(String argValue) {
                synchronized (FlowProbeFlowStats.this) {
                    System.out.println(FlowProbeFlowStats.super.toString() + ": AH packets: " + argValue);
                    packets = Integer.parseInt(argValue);
                    System.out.println("packets set to " + packets);
                    set = true;
                    countdown--;
                }
            }
        },

oString ステートメントは次のようになります。

/* (non-Javadoc)
 * @see java.lang.Object#toString()
 */
@Override
public String toString() {
    return "FlowStats/" + super.toString() + "[flowId: " + flowId + ", packets: " + packets +
    ", bytes: " + bytes + ", delayFromFirstProbeSum: " + delayFromFirstProbeSum +
    ", countdown: " + countdown + "]";
}

印刷物には次のように書かれています。

ahaaaa2:: FlowStats/kokuks.flowmon.FlowProbeFlowStats@1b27882[flowId: 1, packets: 5, bytes: 333, delayFromFirstProbeSum: 0, countdown: -4]

...

[kks-j~KokuKS~/Names] fmxml:FlowMonitor[FlowStats[Flow[flowID: 1,timeFirstTxPacket: 1007829288,timeLastTxPacket: 1524157706,timeFirstRxPacket: 1017862887,timeLastRxPacket: 1534191305,delaySum: 50274395,jitterSum: 212800,lastDelay: 10033599,txBytes: 333, rxBytes: 333,txPackets: 5,rxPackets: 5,lostPackets: 0,timesForwarded: 0],Flow[flowID: 2,timeFirstTxPacket: 1010210025,timeLastTxPacket: 1324387511,timeFirstRxPacket: 1020243624,timeLastRxPacket: 1334421110,delaySum: 50274395,jitterSum: 212800,lastDelay: 10033599,txBytes: 333, rxBytes: 333,txPackets: 5,rxPackets: 5,lostPackets: 0,timesForwarded: 0],Flow[flowID: 3,timeFirstTxPacket: 1017862887,timeLastTxPacket: 1313900107,timeFirstRxPacket: 1027896486,timeLastRxPacket: 1324157706,delaySum: 40615996,jitterSum: 291200,lastDelay: 10257599,txBytes: 762, rxBytes: 762,txPackets: 4,rxPackets: 4,lostPackets: 0,timesForwarded: 0],Flow[flowID: 4,timeFirstTxPacket: 1020243624,timeLastTxPacket: 1313872312,timeFirstRxPacket: 1030277223,timeLastRxPacket: 1324387511,delaySum: 51335996,jitterSum: 481600,lastDelay: 10515199,txBytes: 1082, rxBytes: 1082,txPackets: 5,rxPackets: 5,lostPackets: 0,timesForwarded: 0]],Ipv4FlowClassifier[Flow[flowId: 4, sourceAddress: 10.1.0.1, destinationAddress: 10.1.0.2, protocol: 6],Flow[flowId: 3, sourceAddress: 10.1.0.1, destinationAddress: 10.1.1.2, protocol: 6],Flow[flowId: 2, sourceAddress: 10.1.0.2, destinationAddress: 10.1.0.1, protocol: 6],Flow[flowId: 1, sourceAddress: 10.1.1.2, destinationAddress: 10.1.0.1, protocol: 6]],FlowProbes[FlowProbe[index: 0, stats: <FlowStats/kokuks.flowmon.FlowProbeFlowStats@1b0d2d0[flowId: 1000, packets: 1000, bytes: 1000, delayFromFirstProbeSum: 1000, countdown: 4],FlowStats/kokuks.flowmon.FlowProbeFlowStats@83df14[flowId: 1000, packets: 1000, bytes: 1000, delayFromFirstProbeSum: 1000, countdown: 4],FlowStats/kokuks.flowmon.FlowProbeFlowStats@1aabc29[flowId: 1000, packets: 1000, bytes: 1000, delayFromFirstProbeSum: 1000, countdown: 4],FlowStats/kokuks.flowmon.FlowProbeFlowStats@2758d0[flowId: 1000, packets: 1000, bytes: 1000, delayFromFirstProbeSum: 1000, countdown: 4]>],FlowProbe[index: 1, stats: <FlowStats/kokuks.flowmon.FlowProbeFlowStats@137e19e[flowId: 1000, packets: 1000, bytes: 1000, delayFromFirstProbeSum: 1000, countdown: 4],FlowStats/kokuks.flowmon.FlowProbeFlowStats@1bd5f28[flowId: 1000, packets: 1000, bytes: 1000, delayFromFirstProbeSum: 1000, countdown: 4]>],FlowProbe[index: 2, stats: <FlowStats/kokuks.flowmon.FlowProbeFlowStats@1b27882[flowId: 1000, packets: 1000, bytes: 1000, delayFromFirstProbeSum: 1000, countdown: 4],FlowStats/kokuks.flowmon.FlowProbeFlowStats@5b84b[flowId: 1000, packets: 1000, bytes: 1000, delayFromFirstProbeSum: 1000, countdown: 4]>]]]

属性セッターと toString の同期ステートメントは、JVM のバグをチェックするためにここにありましたが、何もしませんでした。変でしょ?

編集3:

フィールドを Atomic* に変更しました。アトミック フィールドが最終的なものであり、内部でデフォルト値が設定されており、NullPointerException が発生していることを確認して、これを JVM のバグに真剣に取り組まなければなりません。

protected final AtomicInteger flowId = new AtomicInteger();
protected final AtomicInteger packets = new AtomicInteger();
protected final AtomicInteger bytes = new AtomicInteger();
protected final AtomicLong delayFromFirstProbeSum = new AtomicLong();

例外:

Exception in thread "FlowMonitor Updater" java.lang.NullPointerException
    at kokuks.flowmon.FlowProbeFlowStats.toString(FlowProbeFlowStats.java:95)

編集 4: JDK1.7 から 1.6 の安定バージョンに変更しましたが、同じ問題です。

たぶん、フィールドはコンストラクター中に設定解除され、後で設定されます。初期化の順番はよくわかりませんが、この場合はめちゃくちゃになっているのかもしれません。とにかく、それを init メソッドに入れて、それが何かを行うかどうかを確認します。ただし、単一のクラスの場合は機能しないのは奇妙です。それは他の人のために働きます。

4

2 に答える 2

1

出力には何か奇妙なことがありahaaaa2ますahaaaa1。ただし、実際には、ahaaaa2線は前の値のセットから取得されますが、ahaaaa1線は次の値のセットから取得されます。

で始まる行ahaaaa1は、デフォルト値 (0) の行です。ahaaaa2私が期待したように、行は正しい値を持っているようです。の後に改行を1つか2つ追加するSystem.out.println("ahaaaa2:: " + this.toString())と、出力が正しいことがわかると思います。


編集:OK、私はついに問題を見ました。(非常に読みにくい) 出力の最終行の最後に、すべての統計を再度出力します。これが表示されると予想される場所:

FlowStats/kokuks.flowmon.FlowProbeFlowStats@1577d9b[flowId: 4, packets: 4, bytes: 762, delayFromFirstProbeSum: 0]

代わりに次を取得します。

FlowStats/kokuks.flowmon.FlowProbeFlowStats@1577d9b[flowId: 0, packets: 0, bytes: 0, delayFromFirstProbeSum: 0]

他の FlowProbeFlowStats オブジェクトについても同様

何が起こっているのかはわかりませんが、最終的な行がどこで生成されるのか、その間に FlowProbeFlowStats オブジェクトに何が起こるのかについてもわかりません。コードをもっと見ないと、私は助けることができないと思います。

于 2011-02-02T20:52:04.543 に答える
0

セットアップを init メソッドに移動することで問題を修正しました。コンストラクターですべてを実行すると、奇妙なことが起こっていることが判明しました。したがって、アクセスしようとしたときに Atomic* フィールドが null だったのはなぜですか。これは、親コンストラクターへのスーパー コールが最初に実行されてから、まだ設定されていなかったために発生しました。他の要素がうまくいった理由は私にはわかりませんが、それで修正されました.

于 2011-02-04T04:35:23.167 に答える