为什么我不能在将其加载到类类型的变量后访问我的对象属性

时间:2014-07-24 16:58:01

标签: grails groovy nullpointerexception gsp

这可能是最微不足道的问题,但我无法理解为什么我在这里得到java.lang.NullPointerException

basecurr检索了已填充symbolname的正确对象,但我无法访问它们:

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

3 个答案:

答案 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/getratescurrency_one地图中没有params,因此basecurr自然会空值。使用保存导航操作符 - basecurr?.symbol可以避免异常。

如果你是第一次设法渲染视图,那么后续调用就不会出现任何问题。