我正在研究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)
.....
这是一个错误还是一个奇怪的限制?
谢谢,
答案 0 :(得分:8)
由于Scala使用的是Java类,因此字符串长度限制是Java中字符串文字的最大长度,只能是65535个字符。有关详细信息,请参阅此问题的已接受答案:Size of Initialisation string in java
答案 1 :(得分:4)
这是因为普通的旧Java限制。在类文件表中,CONSTANT_Utf8_info表示字符串文字的信息,以及几种名称:类型,成员,描述符和属性。 CONSTANT_Utf8_info表的格式只有两个未指定的字节,用于表示字符串文字信息的字节长度;我相信这就是设置这种限制的地方。 请参阅JVM spec
中的详情