得到NoClassDefFound运行示例代码

时间:2010-06-30 10:46:19

标签: scala

我尝试在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 个答案:

答案 0 :(得分:4)

我试图找出问题所在,它似乎与您输入值的方式有关。

例如,以下代码段按预期工作,打印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中创建了一个名为%TEMP%的文件夹(其中XX代表19个伪随机数字),其中放置了所需的所有编译内容。在那里,创建了一个名为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也会阻止堆栈跟踪被转储),指向主要罪魁祸首 - {{1 }}。

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 ?当你得到一个非数字线时停止。

或者,如果您确实要指示流的结尾,请尝试使用Ctrl-Z(Ctrl-C是终止进程信号)。

Console.in.readLine

- Flaviu Cipcigan

答案 1 :(得分:1)

以下适用于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

所以升级可能是个好主意。

答案 2 :(得分:0)

如果Arjan manages to compile and execute your code,则必须是:

  • scala和/或scalac没有引用您认为的scala
  • sum.scala的旧.class,由您的类路径
  • 选取

确保scalacscala引用,并尝试删除之前生成的任何.class。