2

我正在使用 Netbeans,它只是一个简单的代码,我正在尝试初始化我的名为 primes 的数组,它将由大约 100000 个整数组成,因为,

int[] primes = {0, 0, 1, 1, 1, 1, 2.......................................};

据我所知,这个错误是由于大数组而引起的。我怎样才能摆脱这个“找不到或加载主类”错误?

4

2 回答 2

13

我应该指出,列出 100,000 个元素的数组初始值设定项不会编译。Java 类文件规范对某些事情进行了限制,其中之一是方法的代码数组不能大于 65535 字节。具有 100,000 个值的数组初始值设定项将超过该限制......很容易。

参考:JVM 规范 4.9.1

(规范明确提到了代码大小限制。其他限制没有得到这种处理;例如,常量池中的常量数量,类中的方法数量等等。无论哪种方式,限制都是固有的类文件格式中各种字段的大小。)

我建议您将素数放入 JAR 文件中的资源中,并将它们读入分配有正确大小的数组中。

跟进

“我还尝试将数组中的数字保存在由空格分隔的字符串中 [...] 那么,字符串的大小是否也有限制?”

是的。在(修改的)UTF-8 编码中,字符串文字最多只能有 65535 个字节;请参阅 JVM 规范4.4.34.4.7

(这就是为什么我不推荐这种方法......)


这实际上可能导致您的“找不到主要”问题......但前提是您忽略了编译错误并尝试运行代码。如果您这样做,您应该更改您的 IDE 首选项,这样您就不会意外地尝试运行有编译错误的代码。(它将为您节省时间/痛苦调试真正编译错误的虚假运行时错误......就像这个。)

于 2013-07-07T06:55:01.433 回答
0

如果您提前知道 int 在数组中的位置,则可以使用new int[100000]和 use创建它Arrays.fill()

但是你需要适当地调整你的堆大小......

如您的示例中那样用 1 填充索引 2 到 5,代码将是:

final int[] primes = new int[100000];
Arrays.fill(primes, 2, 6, 1); // upper index is exclusive
// etc etc
于 2013-07-07T08:17:43.737 回答