2

私はNetbeansを使用しています。これは単純なコードであり、素数として名前が付けられた配列を初期化しようとしています。

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

私が気付いた限り、このエラーは配列が大きいために発生しています。この「メインクラスが見つからないか、ロードできませんでした」というエラーを取り除くにはどうすればよいですか?

4

2 に答える 2

13

100,000 個の要素をリストする配列初期化子はコンパイルされないことに注意してください。Java クラスファイルの仕様では、特定の制限が設けられています。そのうちの 1 つは、メソッドのコード配列が 65535 バイトを超えることはできません。100,000 個の値を持つ配列初期化子は、その制限を超えてしまいます ... 簡単に。

参照: JVM 仕様 4.9.1

(仕様では、コード サイズの制限が明示的に言及されています。他の制限はこの扱いを受けません。たとえば、定数プール内の定数の数、クラス内のメソッドの数などです。いずれにせよ、制限はクラスファイル形式のさまざまなフィールドのサイズ)。

素数を JAR ファイルのリソースに配置し、正しいサイズで割り当てられた配列に読み込むことをお勧めします。

ファローアップ

「配列内の数字をスペースで区切られた文字列に保持することも試みました [...] それで、文字列のサイズにも制限はありますか?」

はい。文字列リテラルは、(変更された) UTF-8 エンコーディングで最大 65535 バイトの長さにすることができます。JVM 仕様4.4.3および4.4.7を参照してください。

(だから、そのアプローチはお勧めしませんでした...)


これが実際に「メインが見つからない」という問題を引き起こしている可能性があります...ただし、コンパイルエラーを無視してコードを実行しようとしている場合に限ります。その場合は、コンパイル エラーのあるコードを誤って実行しようとしないように、IDE の設定を変更する必要があります。(実際にはコンパイルエラーである偽のランタイムエラーをデバッグする時間/労力を節約できます...このようなものです。)

于 2013-07-07T06:55:01.433 に答える
0

配列内の int の配置が事前にわかっている場合は、new int[100000]および を使用して作成できますArrays.fill()

ただし、ヒープのサイズを適切に調整する必要があります...

例のようにインデックス 2 から 5 を 1 で埋めるには、コードは次のようになります。

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