문제를 격리하려고 시도했는데 값을 입력하는 방식과 관련이있는 것으로 보입니다.
는 예를 들어, 다음 코드는 6
import scala.io._
def toInt(in: String): Option[Int] =
try {
Some(Integer.parseInt(in.trim))
} catch {
case e: NumberFormatException => None
}
def sum(in: Seq[String]) = {
val ints = in.flatMap(s => toInt(s))
ints.foldLeft(0)((a, b) => a + b)
}
println(sum(List("1","2","3")))
따라서, 문제가 따를 라인의 어딘가에 놓여 있어야 인쇄, 예상대로 작동합니다. Ctrl + C가 Windows에서 실제로하는 일은 Scala 인터프리터가 스크립트를 실행하는 방법과 결합 된 것입니다. 질문에 첨부 한 스크린 샷의 마지막 줄이 출발점이었습니다. 어딘가에 일괄 처리 작업이 실행 중이고 Ctrl-C가 일괄 처리 작업을 종료하기위한 신호를 보냈다고합니다. 실제로 이것은 스칼라 인터프리터 자체 (scala.bat
) 이외의 것입니다. 따라서 입력 스트림을 죽이는 대신 Ctrl-C를 누르면 프로그램을 실행하는 전체 일괄 처리 작업을 중단시키는 신호를 보냅니다!
그래서이 오류는이 작업과 관련이 있습니다. scala
이 스크립트를 실행하는 방법을 살펴 보았습니다. scalascriptXXXXXXXXXXXXXXXXXXX
이라는 폴더 (XX ...는 19 개의 의사 랜덤 숫자를 나타냄)가 %TEMP%
에 만들어져 필요한 모든 컴파일 된 항목이 저장되는 것으로 보입니다. 여기서 Main$$anon$1$$anonfun$1.class
이라는 파일이 생성됩니다.이 파일은 flatMap
함수에 전달되는 익명 함수를 나타냅니다. 이 파일은 프로그램 실행과 병행하여 작성된 것 같습니다. 따라서이 컴파일 작업을 수행하기 전에 프로세스를 종료하면 ClassNotFoundException
이 표시됩니다.
지금이 스크립트를 실행하면 항상이 오류 이 발생한다는 것은 이상한 일입니다. 나는 가끔 그것을 얻을 수 있었다. 항상 Ctrl-C를 누르면 즉시 프롬프트가 나타납니다. Terminate batch job (Y/N)?
. 때로는 예외가 수반됩니다. 때로는 그렇지 않습니다. 나는 그것이 다시 Main$$anon$1$$anonfun$1.class
의 창조와 관련이 있다고 생각한다. 잠시 기다려도 예외는 아닙니다. 시작 후 바로 Ctrl-C를 누르면 예외가 발생합니다.
꽤 많은 수의 실행이 끝나면 완전한 스택 추적을 얻을 수있었습니다 (Ctrl-C가 스택 추적을 중지 할 때처럼). 주 범인 - FileNotFoundException
을 가리 킵니다.
scala sum.scala
Enter some numbers and press ctrl-D (Unix/Mac) ctrl-C (Windows)
1
2
3
4
java.lang.NoClassDefFoundError: Main$$anon$1$$anonfun$1
at Main$$anon$1.sum((virtual file):15)
at Main$$anon$1.<init>((virtual file):25)
at Main$.main((virtual file):4)
at Main.main((virtual file))
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at scala.tools.nsc.ObjectRunner$$anonfun$run$1.apply(ObjectRunner.scala:75)
at scala.tools.nsc.ObjectRunner$.withContextClassLoader(ObjectRunner.scala:49)
at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:74)
at scala.tools.nsc.ScriptRunner$.scala$tools$nsc$ScriptRunner$$runCompiled(ScriptRunner.scala:381)
at scala.tools.nsc.ScriptRunner$$anonfun$runScript$1.apply(ScriptRunner.scala:414)
at scala.tools.nsc.ScriptRunner$$anonfun$runScript$1.apply(ScriptRunner.scala:413)
at scala.tools.nsc.ScriptRunner$.withCompiledScript(ScriptRunner.scala:351)
at scala.tools.nsc.ScriptRunner$.runScript(ScriptRunner.scala:413)
at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:168)
at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
Caused by: java.lang.ClassNotFoundException: Main$$anon$1$$anonfun$1
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 18 more
Caused by: java.io.FileNotFoundException: C:\Users\****\AppData\Local\Temp\scalascript5827128241389779296\Main$$anon$1$$anonfun$1.class (T
he system cannot find the file specified)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at sun.misc.URLClassPath$FileLoader$1.getInputStream(URLClassPath.java:1001)
at sun.misc.Resource.cachedInputStream(Resource.java:59)
at sun.misc.Resource.getByteBuffer(Resource.java:154)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:249)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
... 23 more
Terminate batch job (Y/N)? y
따라서 더 나은 방법으로 값을 입력하는 것이 좋습니다. 어쩌면 Console.in.readLine
을 시도해보십시오. 숫자가 아닌 줄이 생기면 멈 춥니 다.
실제로 스트림의 끝을 표시하려면 Ctrl-Z를 사용하십시오 (Ctrl-C는 종료 프로세스 신호 임).
scala sum.scala
Enter some numbers and press ctrl-D (Unix/Mac) ctrl-C (Windows)
1
3
44
5
6
^Z
Sum 59
- Flaviu Cipcigan
흠, 난 당신의 코드를 시도했습니다,하지만 난 – Overdose
당신이 * nix에서 스크립트 그런 다음, Ctrl-D를 실제로 수행 실행하고 있습니까 2.8.0 RC6과 같은 문제 :(있어? 입력의 끝을 나타냅니다, 그리고 프로그램이 예상대로 실행되어야합니다 :) –