代码之家  ›  专栏  ›  技术社区  ›  Overdose

运行示例代码时得到noclassdeffound

  •  2
  • Overdose  · 技术社区  · 14 年前

    我尝试在scala 2.7.3和2.7.7下运行这段代码,每次我得到这个错误时。怎么了?

    导入scala.io.。_
    
    def toint(in:string):选项[int]=
    尝试{
    一些(integer.parsing(in.trim))
    } catch {
    案例E:NumberFormatException=>无
    }
    
    def sum(in:seq[string])。={
    val ints=in.flatmap(s=>toint(s))。
    ints.foldLeft(0)((a,b)=>a+b)
    }
    
    println(“输入一些数字并按ctrl-d(unix/mac)ctrl-c(windows)”)
    val input=源.frominputstream(system.in)
    val行=input.getlines.collect
    println(“sum”+sum(lines))。
    < /代码> 
    
    

    .

    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))
    

    3 回复  |  直到 14 年前
        1
  •  4
  •   Flaviu Cipcigan    14 年前

    我试图将问题孤立起来,这似乎与你输入价值观的方式有关。

    例如,以下代码段按预期工作,打印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
    

    --弗拉维厄·西皮根

        2
  •  1
  •   Arjan Blokzijl    14 年前

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

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

        3
  •  0
  •   Community CDub    8 年前

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

    • scala和/或scalac不引用您认为的scala
    • 类路径选择的sum.scala的旧.class

    确定什么 scalac scala 引用,并尝试删除以前生成的任何.class。