details.bindFromRequest.fold(
errors => BadRequest(views.html.adminpages.aboutusimgsForm(errors)),
[NoSuchElementException: None.get]
从这个表格
@(details: Form[AboutImages])
<input type="hidden" name="id" value="@details.get.id">
<input type="text" name="name" value="@details.get.name">
我有一个编辑表单aboutusimgs/edit/1
,可以从数据库(mysql)添加文本和隐藏表单输入。
但是当我没有填写表格并且绑定的错误部分执行时:
errors => BadRequest(views.html.adminpages.aboutusimgsForm(errors)),
我得到了NoSuchElementException
我是否因为错误而制作了另一个表单为什么我只能使用编辑表单?
由于
答案 0 :(得分:1)
这里的问题是,如果未设置值,则将None
作为值。 None.get
始终会抛出NoSuchElementException
,因为它显然没有元素。您可以通过多种方式处理Option
,但如果您有默认值,则可以使用getOrElse
。 E.g:
// first map it to the id, then get the value or default if None
details.map(_.id).getOrElse("")
您还应该查看Option
类型的scala docs,并阅读有关如何使用选项的几篇文章中的一篇或两篇。
答案 1 :(得分:0)
要处理Option
的结果,您绝不应该直接使用get
方法。
为什么呢?因为它完全导致Java中潜在的 NullPointerException 概念(因为None
抛出NoSuchElementException)=&gt;以你的编码方式防止安全。
要检索结果,特别是根据检索到的值做一些事情,更喜欢模式匹配或更好,更短的fold
方法:
/** Returns the result of applying $f to this $option's
* value if the $option is nonempty. Otherwise, evaluates
* expression `ifEmpty`.
*
* @note This is equivalent to `$option map f getOrElse ifEmpty`.
*
* @param ifEmpty the expression to evaluate if empty.
* @param f the function to apply if nonempty.
*/
@inline final def fold[B](ifEmpty: => B)(f: A => B): B =
if (isEmpty) ifEmpty else f(this.get)
或者,您可以选择使用getOrElse
方法,如果您只想检索Option
的结果,并在处理None
时提供默认值:
/** Returns the option's value if the option is nonempty, otherwise
* return the result of evaluating `default`.
*
* @param default the default expression.
*/
@inline final def getOrElse[B >: A](default: => B): B =
if (isEmpty) default else this.get
答案 2 :(得分:0)
假设您有List[Option[String]]
或Seq
...解决方案是使用flatMap
删除None
List(Some("Message"),None).map{ _.get.split(" ") } //throws error
但是如果你使用flatmap
List(Some("Message"),None).flatMap{ i => i }.map{ _.split(" ") } //Executes without errors