0

したがって、パブリッククラス宣言の直後に、次のように配列を宣言しました。

public String[] accept;

ここから、ユーザー入力を取得して、この配列の長さを確認します。これに続いて、ループに入り、配列に文字列を入力します。私は以下をメソッドに入れました。

if (scanner.hasNextInt()) {
wcount = scanner.nextInt();
//create the array.
String accept[] = new String[wcount];
}
System.out.println(accept.length);

しかし、残念ながら、いいことではありません。Javaは;で戻ります。

Exception in thread "main" java.lang.NullPointerException

明らかに、配列にデータを入力するためにforループに直接入り込もうとしても、同じ結果が得られます。一見すると、これはメソッド自体の外部でパブリック配列として初期化されることに関係していると思いますが、正直なところよくわかりません。誰かがこれに手を貸すことができますか?

4

4 に答える 4

4

ifブロックで新しい配列を宣言しています。これにより、以前に宣言された配列が非表示になります。ブロックが終了すると、変数はスコープ外になり、(変更されていない)インスタンス変数にアクセスしようとするNPEを取得します。次のように、インスタンス変数を実際に初期化するようにコードを変更します。

if (scanner.hasNextInt()) {
    wcount = scanner.nextInt();

    //create the array.
    accept = new String[wcount];
}
System.out.println(accept.length);
于 2012-11-25T16:35:47.933 に答える
1

新しいaccept []ものをローカル変数として再作成しています。以下のようにループを変更します

if (scanner.hasNextInt()) {
  wcount = scanner.nextInt();
  //create the array.
  accept = new String[wcount];
}
于 2012-11-25T16:36:05.210 に答える
0

ステートメント内に変更String accept[]すると、そのスコープ内で新しいものを再宣言し、古いものを残します。acceptifnull

于 2012-11-25T16:37:38.637 に答える
0
String accept[] = new String[wcount];

変数を宣言し、新しい文字列配列への参照をその変数に格納します。

代わりに、以前に宣言された変数を使用することをお勧めします。これを行うには、代入式を直接使用します。

accept = new String[wcount];
于 2012-11-25T16:41:29.770 に答える