2010-06-30 2 views
2

이 코드를 scala 2.7.3 및 2.7.7에서 실행하려고 시도했으며이 오류가 발생할 때마다 시도했습니다. 뭐가 잘못 되었 니? 스칼라 2.8.0.RC6에NoClassDefFound running sample code

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

답변

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

다음 작품 :


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

흠, 난 당신의 코드를 시도했습니다,하지만 난 – Overdose

+0

당신이 * nix에서 스크립트 그런 다음, Ctrl-D를 실제로 수행 실행하고 있습니까 2.8.0 RC6과 같은 문제 :(있어? 입력의 끝을 나타냅니다, 그리고 프로그램이 예상대로 실행되어야합니다 :) –

0

하면 Arjanmanages to compile and execute your code,는 다음이어야합니다 :

  • 스칼라 및/또는 scalac는 스칼라를 참조하지 당신이 당신의 클래스 경로
을에 의해 포착되어 sum.scala에 대한
  • 옛날의 .class 생각

    무엇이 scalacscala인지 확인하고 이전에 생성 된 .class를 제거하십시오.