首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GGTS空指针异常

GGTS空指针异常
EN

Stack Overflow用户
提问于 2015-07-14 19:36:03
回答 1查看 183关注 0票数 0

我是这里的新手,希望我能解释清楚。

使用Groovy工具套件- GGTS (也称为Spring Tool Suite - STS)阅读Grails in Action book,第二版。

GGTS发布3.6.4版。Grails版本2.4.4

到目前为止,我已经在我的数据库中添加了几个“引号”。当我通过Grails控制台执行"println Quote.count()“时,我看到了4个引号。

我尝试运行我的随机GSP并接收以下错误:

代码语言:javascript
复制
Line | Method
->>    7 | doCall    in C:/Users/donahujc/Documents/workspace-ggts-3.6.4.RELEASE/qotd/grails-app/views/quote/random.gsp
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

Caused by NullPointerException: Cannot get property 'content' on null object**
->>    7 | doCall    in C__Users_donahujc_Documents_workspace_ggts_3_6_4_RELEASE_qotd_grails_app_views_quote_random_gsp$_run_closure2_closure4
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|     10 | run       in C__Users_donahujc_Documents_workspace_ggts_3_6_4_RELEASE_qotd_grails_app_views_quote_random_gsp
|    198 | doFilter  in PageFragmentCachingFilter.java
|     63 | doFilter  in AbstractFilter.java
|   1142 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    617 | run       in java.util.concurrent.ThreadPoolExecutor$Worker
^    745 | run . . . in java.lang.Thread

这件事告诉我的是,我的电话毫无意义。所以,我进入了DBConsole后端,果然,我的Quote表(包含内容和作者)并不存在。

当我的DataSource.groovy文件被更改为以下内容时,这怎么可能呢?

代码语言:javascript
复制
// environment specific settings
environments {
    development {
        dataSource {
            dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
            url = "jdbc:h2:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"

我将“创建-拖放”改为“更新”,并删除了对内存的引用(mem:)。

我知道那里有数据,因为我可以使用Grails控制台来查询它。

复杂的是,我不能一遍一遍地看这本书。因此,我不得不关闭和重新启动GGTS多次在几天。我认为重新运行应用程序会重新初始化表,但情况似乎并非如此。

如何初始化这个表?我试着加了一个新的引号。(不知怎么的,我的索引从第4引号到第33引号。)但我的普惠制还没有一张桌子。

我只是不知道如何初始化这个表(以及其中的数据)。这是我经常遇到的问题,因为我会不断地关闭/重新打开GGTS。

帮助

编辑:(添加更多我的代码)

报价主计长:

代码语言:javascript
复制
def random(){
        def allQuotes = Quote.list()
        def randomQuote
        if (allQuotes.size() > 0){
            def randomIdx = new Random().nextInt(allQuotes.size())
        }else {
            randomQuote = new Quote(author:"Anonymous",
                content:"Real Programmers double peace out on quiche")
        }
        [quote:randomQuote]

    }

Random.gsp

代码语言:javascript
复制
<html>
<head>
<title>Random Quote</title> 
</head>
<body>
<div id="quote">
<q>${quote.content}</q>
<p>${quote.author}</p>
</div>
</body>
</html>

Quote.groovy

代码语言:javascript
复制
class Quote {

    String author
    String content
    Date created = new Date()

    static constraints = {
    }
}

到目前为止一切都很顺利。我知道我的数据在DB中,因为我可以从Grails控制台查询它。但是DB控制台甚至没有显示我的引号表:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-15 13:27:19

如果这实际上是您正在使用的代码,那么您将自责:)。注意,Groovy中未初始化的变量被赋予默认值null。因此,randomQuote变量在random操作中的初始值是null

然后将randomQuote变量的值分配给视图模型中的quote变量。查看视图,我可以看出NullPointerException是由${quote.content}表达式抛出的。因此,如果quote在模型中为null,这必然意味着randomQuote在操作中是null

那么,当数据库中有引号时会发生什么呢?这一行动采取了以下行动:

代码语言:javascript
复制
if (allQuotes.size() > 0) {
    def randomIdx = new Random().nextInt(allQuotes.size())
}

如您所见,没有分配给randomQuote变量,所以它仍然是null。本书清单1.3中的代码如下:

代码语言:javascript
复制
if (allQuotes.size() > 0) {
    def randomIdx = new Random().nextInt(allQuotes.size())
    randomQuote = allQuotes[randomIdx]
}

或者至少我希望是这样。它出现在我的PDF版本中。

这是有点长篇大论,但我希望你能遵循推理,并使用它来诊断你遇到的其他问题。我认识到,对于新来者来说,解释他们所遇到的各种错误并不总是容易的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31415758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档