2013-06-29 111 views
2

我正在Scala 2.10.2上工作。当运行下面简单的代码:斯卡拉长字符串错误

object Test { 
    var input = "**** ANY STRING LONGER THAN 65535 CHARACTERS ****" 
    def main(args: Array[String]) { 
     println(input) 
    } 
} 

以下错误被抛出:

java.lang.ClassFormatError: Unknown constant tag 67 in class file Test$ 
at java.lang.ClassLoader.defineClass1(Native Method) 
at java.lang.ClassLoader.defineClass(ClassLoader.java:791) 
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:423) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
at Test.main(05.scala) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:601) 
..... 

这是一个错误或一个奇怪的限制吗?

谢谢,

回答

6

由于Scala在封面下使用Java类,字符串长度限制是Java中字符串字面量的最大长度,它只能是65535个字符。有关更多详细信息,请参阅此问题的接受答案:Size of Initialisation string in java

4

这是因为普通的旧Java限制。在类文件表中,CONSTANT_Utf8_info表示String文字的信息,以及几种名称:类型,成员,描述符和属性。 CONSTANT_Utf8_info表格的格式对于表示字符串文字信息的字节长度只有两个非入口字节;我相信这就是设定这种限制的地方。 查看更多的JVM spec