Groovy / Postgres"没有方法签名:java.lang.String.positive()"

时间:2015-06-25 08:09:20

标签: groovy

尝试使用JDBC编写一些基本的PostgreSQL代码,最终集成到用Groovy编写的应用程序中。我编写了这个Groovy代码来连接数据库然后执行语句;但是,我收到了一个错误,我试图找到解决方案,但不能。以下是Groovy代码的相关部分,以及关于错误发生位置的注释:

base("myDbContext")

控制台日志说:

    Sql Instance: groovy.sql.Sql@5aa9e4eb
    The row Id is: 1
    Caught: groovy.lang.MissingMethodException: No signature of method: java.lang.String.positive() is applicable for argument types: () values: []
    Possible solutions: notify(), tokenize(), size(), size()
    groovy.lang.MissingMethodException: No signature of method: java.lang.String.positive() is applicable for argument types: () values: []
    Possible solutions: notify(), tokenize(), size(), size()
        at DatabaseTest$_run_closure1.doCall(DatabaseTest.groovy:34)
        at DatabaseTest.run(DatabaseTest.groovy:31)
        at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

    Process finished with exit code 1

知道我做错了吗?

2 个答案:

答案 0 :(得分:18)

另一个答案为您提供了我也建议的解决方案,但仍然可以通过原因来了解原因

Groovy过度使用运算符重载。这意味着如果您要编写自己的类,可以重载+运算符以执行许多操作。

但是,在行的末尾和行的开头使用+之间存在差异。

在一行结束时,+被视为二元运算符 a + b表示追加,但是在行的开头,它被视为一元运算符 positive(将“+ 6”视为“正六”)。

如果你要写这个,它会更好:

println "The row Id is: ${row.id}" +
    "The word is: ${row.word}" +
    "The number is: ${row.number}" +
    "The decimal is: ${row.decimal}" +
    "The date-time is: ${row.datetime}"

但是,如果你这样做,你会得到一行的输出,那是因为你没有添加换行符,\n

println "The row Id is: ${row.id}\n" +
    "The word is: ${row.word}\n" +
    "The number is: ${row.number}\n" +
    "The decimal is: ${row.decimal}\n" +
    "The date-time is: ${row.datetime}"

现在事情开始变得更加丑陋,这就是为什么Groovy的多行字符串功能可以派上用场,如另一个答案所示。

答案 1 :(得分:10)

不要使用可怕的字符串连接!在Groovy中有一个很好的替代品:

println """The row Id is: ${row.id}
    The word is: ${row.word}
    The number is: ${row.number}
    The decimal is: ${row.decimal}
    The date-time is: ${row.datetime}"""