首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么这段代码抛出空指针异常

为什么这段代码抛出空指针异常
EN

Stack Overflow用户
提问于 2019-09-18 12:48:59
回答 1查看 49关注 0票数 0

我正在尝试编写一个递归解析器combinator类

代码语言:javascript
运行
复制
import scala.util.parsing.combinator._
class MyParser extends RegexParsers {
  override val skipWhitespace = true
  val singleValue = "[\\p{L}][\\p{L}0-9_\\*]*".r
  val expr : Parser[Any] = subExpr ~ rep("&" ~ subExpr | "|" ~ subExpr)
  val subExpr : Parser[Any] = singleValue | "(" ~ expr ~ ")"
} 

当我尝试实例化它时。它抛出空指针异常

代码语言:javascript
运行
复制
val parser = new MyParser 

java.lang.NullPointerException
  ammonite.$sess.cmd8$MyParser.<init>(cmd8.sc:4)
  ammonite.$sess.cmd9$.<init>(cmd9.sc:1)
  ammonite.$sess.cmd9$.<clinit>(cmd9.sc)

我真的不知所措。代码中绝对没有任何内容会在构造时导致空指针异常。不知道发生了什么

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-18 12:52:10

MyParser的两个成员exprsubExpr必须在每次创建MyParser时进行初始化,但它们相互引用。它们按顺序求值,并且在求值expr时,subExpr仍设置为null。这个问题的一个简化版本是:

代码语言:javascript
运行
复制
class Bad {
    val one = two - 1
    val two = one + 1
}

您可能希望将exprsubExpr更改为方法(使用def),以便在需要时才检索它们。

另请参阅FAQ: Why is my abstract or overridden val null?

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

https://stackoverflow.com/questions/57985260

复制
相关文章

相似问题

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