Я пытался выделить проблему, и, похоже, это связано с тем, как вы вводите свои значения.
Например, следующий фрагмент кода работает должным образом, печатая 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)?
.Иногда это сопровождается исключением.Иногда нет.Я думаю, что это снова связано с созданием 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