2016-12-13 1 views
0

sbt에서 실행하려고 할 때 스칼라 프로젝트에서 기괴한 동작이 발생합니다.스칼라 정규 표현식을 사용하는 java.lang.NullPointerException

java.lang.NullPointerException이를 throw 선은 이것이다 :

그것은 내부
id <- urlReg.findFirstIn(line).map(_.split("/").lift(3)) 

A의-이해 :

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

나는 스칼라 콘솔에서이 라인을 테스트, I findFirstInOption[String]을 반환하므로 None 또는 Some[String]을 반환하고 결코 java.lang.NullPointerException을 던져서는 안됩니다.

이 코드는 예외를 throw하지 않고 잠시 실행 한 다음 예외를 throw하기 시작했습니다.

URLREG 입력의 샘플 라인 내 설정에서 일부 호환성이 기대

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" -""" 

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

입니다. 나는 달리고있다 :

  • MacOS 시에라 10.12.1.
  • SBT 0.13.13
  • 스칼라 2.12.1
  • 자바 1.8.0_112
+0

'.findFirstIn (line)'이'Some (null)'을 반환하면'_.split ("/")'는 NPE를 던질 수 있습니다. 어쩌면 그것이 문제일까요? – marstran

+0

'id <- urlReg.findFirstIn (line)'을 실행하는'split' 호출없이 시도했습니다. 나는 똑같은 오류가있다. –

+0

입력 내용을 확인하십시오. urlReg이란 무엇입니까? – marstran

답변

1

나는 또한 그것에서 함수의 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하여지도/필터를 교체 할 수 있어야하지만 난 그것을 실패했습니다. 그건 그걸 단순하게해야하고 거기에 못생긴 nulls 없애 버려.

행운을 빈다.

관련 문제