簡體   English   中英

Scala正則表達式的java.lang.NullPointerException

[英]java.lang.NullPointerException with Scala regex

當我嘗試從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]並且永遠不會拋出java.lang.NullPointerException

這段代碼運行了一段時間而沒有引發異常,然后開始引發異常。

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

輸入的樣本行是

val sampleLine = """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" -"""

我希望我的設置中有些不兼容。 我在跑步:

  • MacOS Sierra 10.12.1。
  • sbt 0.13.13
  • 斯卡拉2.12.1
  • Java 1.8.0_112

我還認為這是由於腳本中的函數2返回的某些Option [String]類型所致。

您是否考慮使用以下地圖/過濾器組合:

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替換地圖/過濾器,但是我沒有成功。 那應該簡化它並擺脫那里的丑陋的空值。

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM