Получил NoClassDefFound запущенный пример кода - PullRequest
2 голосов
/ 30 июня 2010

Я пытался запустить этот код под Scala 2.7.3 и 2.7.7, и каждый раз, когда я получаю эту ошибку. Что не так?

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("Enter some numbers and press ctrl-D (Unix/Mac) ctrl-C (Windows)")
val input = Source.fromInputStream(System.in)
val lines = input.getLines.collect
println("Sum "+sum(lines))

alt text

Ответы [ 3 ]

4 голосов
/ 30 июня 2010

Я пытался выделить проблему, и, похоже, это связано с тем, как вы вводите свои значения.

Например, следующий фрагмент кода работает должным образом, печатая 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

1 голос
/ 30 июня 2010

На scala 2.8.0.RC6 работает следующее:


import scala.io._

def toInt(in: String): Option[Int] =

try {
  Some(Integer.parseInt(in.trim))
} catch { case e: NumberFormatException => None}

def sum(in: Iterator[String]) = {
     in.toList.flatMap(s => toInt(s)).foldLeft(0)((a, b) => a + b)
}

println("Enter some numbers and press ctrl-D (Unix/Mac) ctrl-C (Windows)")
val input = Source.fromInputStream(System.in)
val lines = input.getLines
println("Sum "+sum(lines))


scala sum.scala
Enter some numbers and press ctrl-D (Unix/Mac) ctrl-C (Windows)
4
3
5
Sum 12

Так что, возможно, это хорошая идея для обновления.

0 голосов
/ 30 июня 2010

Если Arjan удастся скомпилировать и выполнить ваш код, , тогда это должно быть:

  • scala и / или scalac, не ссылающиеся на скалу, которую вы считаете
  • старый .class для sum.scala, выбранный вашим classpath

Убедитесь, что ссылаются на scalac и scala, и попробуйте удалить любой ранее созданный .class.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...