这可能是最微不足道的问题,但我无法理解为什么我在这里得到java.lang.NullPointerException
?
basecurr
检索了已填充symbol
和name
的正确对象,但我无法访问它们:
GSP页面
<g:form name="selectCurrencyForm" url="[action:'getrates',controller:'currency']">
<g:select name="currency_one" from="${Currency?.list()}" optionValue="name" optionKey="id"/>
<g:submitButton name="submit" value="Show Rates" />
</g:form>
控制器中的方法:
def getrates(){
Currency basecurr = Currency.get(params.currency_one)
println basecurr.symbol
}
类货币
class Currency {
String symbol
String name
String rate
static constraints = {
}
}
上述java.lang.NullPointerException
访问symbol
的{{1}} basecurr
println
属性{/ 1}}
添加例外堆栈
2014-07-25 00:35:47,214 [http-bio-8080-exec-6] ERROR errors.GrailsExceptionResolver - NullPointerException occurred when processing request: [GET] /Appname/Controller/getrates
Stacktrace follows:
Message: null
Line | Method
->> 26 | getrates in exchangeratechecker.ExchangeRateController$$EOkyECes
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 198 | doFilter in grails.plugin.cache.web.filter.PageFragmentCachingFilter
| 63 | doFilter in grails.plugin.cache.web.filter.AbstractFilter
| 1142 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 617 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^ 745 | run in java.lang.Thread
答案 0 :(得分:0)
我会尝试编写集成测试来消除GSP代码。你能通过ID获得货币对象并打印出来吗?你在用什么类型的数据库?
void "Getting Currency"() {
given:
def currency= Currency.findById(1L)
println("Currency: "+currency)
println("Currency Symbol: "+currency.symbol)
expect:
currency != null
}
答案 1 :(得分:0)
此操作的第二行发生异常
def getrates(){
Currency basecurr = Currency.get(params.currency_one)
println basecurr.symbol
}
所以似乎唯一可能的解释是没有Currency
的ID与params.currency_one
匹配,因此返回null
Currency basecurr = Currency.get(params.currency_one)
答案 2 :(得分:0)
您的域类和控制器应该具有相同的包,并且您的视图应该包含Currency
类的导入页面指令,否则,Groovy将使用http://docs.oracle.com/javase/7/docs/api/java/util/Currency.html,因为Groovy会自动导入java.util.*
对你而言。
NPE是由于您第一次尝试访问/currency/getrates
时currency_one
地图中没有params
,因此basecurr
自然会空值。使用保存导航操作符 - basecurr?.symbol
可以避免异常。
如果你是第一次设法渲染视图,那么后续调用就不会出现任何问题。