3

リストdef vrs=["6.0","6.1","6.1.0"](バージョン) があり、この値を持つ関数でマップを取得しますdef test=[version:6.1 HotFix11]

testversion値がリストと一致するかどうかを確認するにはどうすればよいvrsですか?

私はこれを試しましvrs.each{ver-> println test.version.contains(ver)}たが、それは与えますException in thread "main" java.lang.StackOverflowError

アップデート

結局のところ、私のコードに何か問題がありました。小さな Groovy スクリプトでテスト ケースを試してみましたが、うまくいきました。

完全なコードは次のとおりです。

private Map params
private def root

private def nineBelow

XmlHandler(String xml)
{
    nineBelow=["6.0","6.1","6.1.0"]

    params=[:]
    root=new XmlParser().parseText(xml)
}
def getParams()
{
    if(root.product.version.size()>0)
    {
        params.version=root.product.version.text()
    }

    /*nineBelow.each {
        println params.version  //even this throws java.lang.StackOverflowError
        //println "$it , ${params.version}"
        //println ver.getClass()+", "+params.version.getClass()
         }*/

    println nineBelow.each{ver-> println params.version.contains(ver)}

    /*I need to check whether `params.version` matches with `nineBelow` list, so i'll check for condition here*/

    params
}

呼び出す別のクラスgetParams()

static main(args) {

    String fileContents = new File('E://Projects/agent6.1.xml').text
    XmlHandler xm=new XmlHandler(fileContents)  

    def params=xm.getParams()
    println params
}

アップデート

私にもprintln nineBelow.each { println params.version}くれますException in thread "main" java.lang.StackOverflowError

もっとアップデート

以下のコードの後に​​のみ機能しました

def ver=params.version
    println nineBelow.each { println ver.contains(it) }

ここで何が問題なのですか?

4

2 に答える 2

3

xml の例で失敗する例はありますか? これは(質問の上部でクラッシュすると言っています)実際に機能するためです。

def vrs=["6.0","6.1","6.1.0"]
def test=[ version:'6.1 HotFix11' ]

vrs.each { ver-> println test.version.contains( ver ) }

と印刷:

false
true
false

しかし、何が含まれているかわからないため、他のコードに問題を見つけることができません'E://Projects/agent6.1.xml'...

于 2012-04-27T08:09:14.303 に答える
1

あなたのコードは次のとおりだと思います:

class XmlHandler {
    private Map params
    private def root

    private def nineBelow

    XmlHandler(String xml)
    {
        nineBelow=["6.0","6.1","6.1.0"]

        params=[:]
        root=new XmlParser().parseText(xml)
    }

    def getParams()
    {
        if(root.product.version.size()>0)
        {
            params.version=root.product.version.text()
        }

        nineBelow.each {
            println params.version  //even this throws java.lang.StackOverflowError
           //println "$it , ${params.version}"
           //println ver.getClass()+", "+params.version.getClass()
        }
   }
}

def doc = """
    <root>
        <product>
            <version>1.0</version>
        <version>2.0</version>
        <version>3.0</version>
        <version>4.0</version>
        <version>5.0</version>
    </product>
</root>
"""

XmlHandler handler = new XmlHandler(doc)
handler.getParams()

したがって、println params.versionあなたは実際に呼び出しているため、getParams().version無限の再帰呼び出しに入ります。

フィールドの前に Groovy @symbol をチェックしてください。tim_yatesが言うように、¿バグまたは機能?

于 2012-04-27T08:23:12.400 に答える