0

对不起,很长的消息 - 希望,你会读到它。我开始学习 Scala 课程。它是 FTP 服务器。它使用模式匹配进行命令识别。我在 Eclipse 中编写代码。我认为,SBT 有一个错误,但我不知道从哪里说。

说明:编译时间长。编译后IDE中没有任何错误。但是“问题”面板中有下一行:

SBT 构建器在编译您的项目时崩溃。这是 Scala 编译器或 SBT 中的错误。检查错误日志以了解详细信息。错误消息是:ch.epfl.lamp.fjbg.JCode$OffsetTooBigException: offset too big to fit in 16 bits: 38838 FTPDaemon Unknown Scala Problem

但程序启动并运行。运行时的下一个错误:

java.lang.ClassLoader.defineClass(ClassLoader.java:787) 在 java.security.SecureClassLoader.defineClass 的线程“主”java.lang.ClassFormatError 中的异常:在 java.lang.ClassLoader.defineClass1(Native Method) 的截断类文件(SecureClassLoader.java:142) 在 java.net.URLClassLoader.defineClass(URLClassLoader.java:447) 在 java.net.URLClassLoader.access$100(URLClassLoader.java:71) 在 java.net.URLClassLoader$1.run(URLClassLoader. java:361) 在 java.net.URLClassLoader$1.run(URLClassLoader.java:355) 在 java.security.AccessController.doPrivileged(Native Method) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:354) 在 java. lang.ClassLoader.loadClass(ClassLoader.java:423) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 在 java.lang.ClassLoader。loadClass(ClassLoader.java:356) at org.egslava.ftp.ControlConnection.(ControlConnection.scala:14) at org.egslava.ftp.Main$.main(Main.scala:38) at org.egslava.ftp.Main .main(Main.scala)

当我执行 new ControlConnection().start(); 时显示此错误 ControlConnection 使用变量 currentState(指向抽象类 FtpState 的指针)。当前状态可能是 DoLogin 类或 WaitForCommandsState 类的实例。

WaitForCommands 包含下一个代码块:

message match{  
case owner.Noop() => "200 NOOP ok\r\n";     
case owner.User(_) => "530 Can't change from guest user\r\n";   
case owner.Pass(_) => "230 Already logged in\r\n";  
case owner.Pasv() => pasv() + "\r\n";   case owner.List() => list() + "\r\n";   
case "condition" => "error";    
case owner.Nlst() => nlst() + "\r\n";   
case owner.TypeCMD() => ""//"200 Switching to binary mode\r\n";
case "PWD" => "257 \"" + currentDirectory + "\"\r\n";   
case "SITE HELP" => "200-\r\n200\r\n";  
case owner.Cwd(path) => "250 Directory successfuly changed\r\n";
case "condition2" => "error2"   
case unrecognizedCommand => "500 Unrecognized command " + unrecognizedCommand + "\r\n"; 
}

如果我评论字符串(任何): case "condition" => "error";
或者 case "condition2" => "error2"
错误就会消失。

它是什么?

4

1 回答 1

2

用于编译模式匹配的算法将在过大的 case 语句上失败,因为生成的字节码长于 JVM 类允许的最大值。据我了解,这将在 Scala 2.10 中修复。

于 2012-06-08T10:57:39.027 回答