我试图将问题孤立起来,这似乎与你输入价值观的方式有关。
例如,以下代码段按预期工作,打印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解释器本身。(
scala.bat
)因此,当您按下ctrl-c时,不是简单地终止输入流,而是发送一个信号来终止运行程序的整个批处理作业!
所以这个错误与这个动作有关。我看过
scala
运行脚本。一个名为
scalascriptXXXXXXXXXXXXXXXXXXX
(XX)表示19个伪随机数字)。
%TEMP%
所有需要编译的东西都放在那里。在那里,一个名为
Main$$anon$1$$anonfun$1.class
已创建--这表示传递给
flatMap
功能。这个文件似乎是在程序运行的同时创建的。因此,如果在进程有机会编译之前终止它,您将得到
ClassNotFoundException
.
现在,奇怪的是你得到了这个错误
总是
你运行你的脚本。我偶尔能弄到。不过,只要按ctrl-c,我就会得到
Terminate batch job (Y/N)?
提示。有时也伴随着例外。有时不会。我认为这又与
主$$anon$1$$anonfun$1.class
. 如果我等一段时间,我也不会例外。如果在开始后立即按ctrl-c,就会得到异常。
经过多次运行,我设法获得了完整的堆栈跟踪(我想…当ctrl-c停止堆栈跟踪被转储时,指向主要的罪犯--a
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
--弗拉维厄·西皮根