使用Scala正则表达式的java.lang.NullPointerException

时间:2016-12-13 08:20:45

标签: scala sbt

当我尝试从sbt运行时,我的scala项目中有一种奇怪的行为。

抛出java.lang.NullPointerException的行是:

id <- urlReg.findFirstIn(line).map(_.split("/").lift(3))

这是为了理解:

for {
  line <- Source.fromFile(fileName).getLines()
  id <- urlReg.findFirstIn(line).map(_.split("/").lift(3))
  dateString <- dateReg.findFirstMatchIn(line).map(_.group(1))
} yield {...}

当我在scala控制台上测试此行时,我看到findFirstIn返回Option[String],因此它应该返回NoneSome[String]并且永远不会抛出{ {1}}。

此代码运行了一段时间而没有抛出异常,然后开始抛出异常。

urlReg是      java.lang.NullPointerException

输入的示例行是

val urlReg = "[GET,POST,DELETE,PUT]\\s{1}[\\w/]+".r

我希望我的设置有一些不兼容性。我正在跑步:

  • MacOS Sierra 10.12.1。
  • sbt 0.13.13
  • scala 2.12.1
  • java 1.8.0_112

1 个答案:

答案 0 :(得分:1)

我还认为这是由于某些Option [String]类型由脚本中的2个函数返回。

您是否考虑使用如下所示的地图/过滤器组合:

val faultyLine = """10.10.6.90 - - 15/Aug/2016:23:59:20 -0500 "GET /ecf8427eb443dc7f71f28176174ef7351dd4d421 HTTP/1.0" 200 - "-" "-" 7 "10.10.1.231, 10.10.6.90" -"""
val line= """10.10.6.90 - - 15/Aug/2016:23:59:20 -0500 "GET /ecf8427e/b443dc7f/71f28176/174ef735/1dd4d421 HTTP/1.0" 200 - "-" "-" 7 "10.10.1.231, 10.10.6.90" -"""

val lines = List(line,line,faultyLine)

lines.map(line => (urlReg.findFirstIn(line).map(_.split("/").lift(3))).match {
case Some(Some(a)) => a 
case _ => null
}).filter( _ != null )

你应该可以用flatMap替换map / filter,但我没有成功。这应该简化它并摆脱那里的丑陋零点。

祝你好运!