java 尝试为实体创建密钥时获取 IllegalArgumentException
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/13541574/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
getting IllegalArgumentException when trying to create key for entity
提问by Ahmet Tanakol
I'm working on Google App Engine and I'm stuck at a point. I'm trying to create a key for my entity. Here is the code:
我正在研究 Google App Engine,但我遇到了问题。我正在尝试为我的实体创建一个密钥。这是代码:
Element child = (Element) itr.next();
String name = "";
if(child.getQualifiedName().equals("name")){
name += child.getText();
}
Key drugKey = KeyFactory.createKey("DrugTarget", name);
I'm 100% sure that child.getText() doesn't return null. I tested it already. I have another piece of code that creating Key works perfectly. Both seem similar to each other.
我 100% 确定 child.getText() 不会返回 null。我已经测试过了。我还有一段代码可以完美地创建 Key 。两者似乎彼此相似。
String drug = req.getParameter("drugname");
Key drugKey = KeyFactory.createKey("DrugTarget", drug);
I really did'nt understand why it gives error. First piece of code is belonged to a Java Class and I call this class in a Java Servlet Class. The second one is belonged to a Java Servlet Class. But I think the problem is different. Could you please help? Thanks.
我真的不明白为什么它会出错。第一段代码属于 Java 类,我将这个类称为 Java Servlet 类。第二个属于 Java Servlet 类。但我认为问题是不同的。能否请你帮忙?谢谢。
Edited Part:
编辑部分:
if(child.getQualifiedName().equals("name")){
if(child.getText() != null){
name = child.getText();
}
else{
name = "asd";
}
}
I put this into my code, still getting null error. child.getText() does not return null and name is not equal to "asd".
我把它放到我的代码中,仍然得到空错误。child.getText() 不返回 null 并且 name 不等于“asd”。
Forgot to add Error Message:
忘记添加错误信息:
Uncaught exception from servlet
java.lang.IllegalArgumentException: name cannot be null or empty
at com.google.appengine.api.datastore.KeyFactory.createKey(KeyFactory.java:73)
at com.google.appengine.api.datastore.KeyFactory.createKey(KeyFactory.java:60)
at guestbook.saxParser2.getDrug(saxParser2.java:42)
at guestbook.SignGuestbookServlet.doPost(SignGuestbookServlet.java:77)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:102)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:266)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:146)
at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:447)
at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:454)
at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:461)
at com.google.tracing.TraceContext.runInContext(TraceContext.java:703)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:338)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:330)
at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:458)
at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
at java.lang.Thread.run(Thread.java:679)
回答by Endox
The error message said:
错误信息说:
Uncaught exception from servlet
java.lang.IllegalArgumentException: name cannot be null or empty
And your actual code:
而你的实际代码:
String name = "";
if(child.getQualifiedName().equals("name")){
name += child.getText();
}
Key drugKey = KeyFactory.createKey("DrugTarget", name);
So in the if statement the child.getQualifiedName().equals("name")
expression is false, and the 'name' String variable is still an empty String (String name = ""
).
And that is what the error message said: cannot be an empty String at Key drugKey = KeyFactory.createKey("DrugTarget", name);
as parameter.
所以在 if 语句中,child.getQualifiedName().equals("name")
表达式为假,并且 'name' String 变量仍然是一个空的 String ( String name = ""
)。这就是错误消息所说的:Key drugKey = KeyFactory.createKey("DrugTarget", name);
作为参数不能是空字符串。
EDIT: Try out this:
编辑:试试这个:
Element child = (Element) itr.next();
String name = "defaultName";
if(child.getQualifiedName().equals("name")){
name = child.getText();
}
Key drugKey = KeyFactory.createKey("DrugTarget", name);
The problem isn't that the child.getText()
return with null or not, the problem is the expression at your if statement will be false
, so the name += child.getText();
is unreachable and the name
still an empty String.
问题不在于child.getText()
返回是否为 null,问题在于 if 语句中的表达式将是false
,因此name += child.getText();
无法访问并且name
仍然是空字符串。
if(child.getQualifiedName().equals("name")){
name += child.getText();
}
回答by Mukul Goel
"cooke up" ready to eat.
“做饭”准备吃。
Element child = (Element) itr.next();
String name;
if(child.getQualifiedName().equals("name")){
name = child.getText();
if(name!=null){
Key drugKey = KeyFactory.createKey("DrugTarget", name);
}
}