GGTS 空指针异常
GGTS Null Pointer Exception
我是新手,希望能解释清楚。
使用 Groovy Grails 工具套件 - GGTS(又名 Spring 工具套件 - STS)学习 Grails in Action 书,第二版。
GGTS 版本 3.6.4。 Grails 版本 2.4.4
我还在第 1 章。此时,我已经向我的数据库添加了几个 'quotes'。当我通过 Grails 控制台执行 "println Quote.count()" 时,我看到我有 4 个引号。
我尝试 运行 我的随机 GSP 并收到以下错误:
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 后端,果然,我的引用 table(包含内容和作者)不存在。
这怎么可能,当我的 DataSource.groovy 文件更改为以下内容时:
// 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"
我将 "create-drop" 更改为 "update" 并删除了对内存 (mem:) 的引用。
我知道数据在那里,因为我可以使用 Grails 控制台查询它。
复杂的部分是我不能一下子看完这本书。所以我不得不在几天内多次关闭并重新启动 GGTS。我认为重新 运行 应用程序会重新初始化 table,但事实并非如此。
如何初始化这个 table?我尝试添加新报价。 (不知何故,我的索引从引用 #4 变成了引用 #33。)但我的 GSP 仍然没有 table。
我只是不知道如何初始化这个 table(以及其中某处的数据)。这是我会一直遇到的问题,因为我会一直 closing/re-opening GGTS。
帮助
编辑:(添加更多我的代码)
报价控制器:
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
<html>
<head>
<title>Random Quote</title>
</head>
<body>
<div id="quote">
<q>${quote.content}</q>
<p>${quote.author}</p>
</div>
</body>
</html>
Quote.groovy
class Quote {
String author
String content
Date created = new Date()
static constraints = {
}
}
到目前为止一切正常。我知道我的数据在数据库中,因为我可以从 Grails 控制台查询它。但是数据库控制台甚至没有显示我的报价 table :(
如果这实际上是您正在使用的代码,您会很生气的:)。请注意,Groovy 中未初始化的变量被赋予默认值 null
。因此 random
动作中 randomQuote
变量的初始值为 null
.
randomQuote
变量的值然后分配给视图模型中的 quote
变量。查看视图,我可以看出 NullPointerException
是由 ${quote.content}
表达式抛出的。因此,如果 quote
在模型中为 null,那一定意味着 randomQuote
在操作中为 null
。
那么当数据库中有引号时会发生什么?该操作采用此分支:
if (allQuotes.size() > 0) {
def randomIdx = new Random().nextInt(allQuotes.size())
}
如您所见,randomQuote
变量没有赋值,所以它仍然是 null
。本书清单 1.3 中的代码是这样的:
if (allQuotes.size() > 0) {
 def randomIdx = new Random().nextInt(allQuotes.size())
randomQuote = allQuotes[randomIdx]
}
或者至少我希望如此。它出现在我的 PDF 版本中。
这有点啰嗦,但我希望您能遵循推理并用它来诊断您遇到的其他问题。我认识到,对于新手来说,解释他们遇到的各种错误并不总是那么容易。
我是新手,希望能解释清楚。
使用 Groovy Grails 工具套件 - GGTS(又名 Spring 工具套件 - STS)学习 Grails in Action 书,第二版。
GGTS 版本 3.6.4。 Grails 版本 2.4.4
我还在第 1 章。此时,我已经向我的数据库添加了几个 'quotes'。当我通过 Grails 控制台执行 "println Quote.count()" 时,我看到我有 4 个引号。
我尝试 运行 我的随机 GSP 并收到以下错误:
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 后端,果然,我的引用 table(包含内容和作者)不存在。
这怎么可能,当我的 DataSource.groovy 文件更改为以下内容时:
// 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"
我将 "create-drop" 更改为 "update" 并删除了对内存 (mem:) 的引用。
我知道数据在那里,因为我可以使用 Grails 控制台查询它。
复杂的部分是我不能一下子看完这本书。所以我不得不在几天内多次关闭并重新启动 GGTS。我认为重新 运行 应用程序会重新初始化 table,但事实并非如此。
如何初始化这个 table?我尝试添加新报价。 (不知何故,我的索引从引用 #4 变成了引用 #33。)但我的 GSP 仍然没有 table。
我只是不知道如何初始化这个 table(以及其中某处的数据)。这是我会一直遇到的问题,因为我会一直 closing/re-opening GGTS。
帮助
编辑:(添加更多我的代码)
报价控制器:
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
<html>
<head>
<title>Random Quote</title>
</head>
<body>
<div id="quote">
<q>${quote.content}</q>
<p>${quote.author}</p>
</div>
</body>
</html>
Quote.groovy
class Quote {
String author
String content
Date created = new Date()
static constraints = {
}
}
到目前为止一切正常。我知道我的数据在数据库中,因为我可以从 Grails 控制台查询它。但是数据库控制台甚至没有显示我的报价 table :(
如果这实际上是您正在使用的代码,您会很生气的:)。请注意,Groovy 中未初始化的变量被赋予默认值 null
。因此 random
动作中 randomQuote
变量的初始值为 null
.
randomQuote
变量的值然后分配给视图模型中的 quote
变量。查看视图,我可以看出 NullPointerException
是由 ${quote.content}
表达式抛出的。因此,如果 quote
在模型中为 null,那一定意味着 randomQuote
在操作中为 null
。
那么当数据库中有引号时会发生什么?该操作采用此分支:
if (allQuotes.size() > 0) {
def randomIdx = new Random().nextInt(allQuotes.size())
}
如您所见,randomQuote
变量没有赋值,所以它仍然是 null
。本书清单 1.3 中的代码是这样的:
if (allQuotes.size() > 0) {
 def randomIdx = new Random().nextInt(allQuotes.size())
randomQuote = allQuotes[randomIdx]
}
或者至少我希望如此。它出现在我的 PDF 版本中。
这有点啰嗦,但我希望您能遵循推理并用它来诊断您遇到的其他问题。我认识到,对于新手来说,解释他们遇到的各种错误并不总是那么容易。