0

名前を含む文字列配列がある簡単なプログラムを1つ作成しました。

このプログラムは、文字列配列でユーザーが指定した名前を検索します。存在する場合は、name foundそうでないことを示しますnot found

名前を付けている場合、つまり文字列にすでに存在している場合、プログラムは完全に機能していますが、名前を付けている場合、つまり文字列に存在しない場合はエラーが表示されます。

import java.util.Scanner;

class Work {

    Scanner in = new Scanner(System.in);

    String e_name;
    String name[]=new String [50];

    void getname()
    {
         System.out.println("enter the name");
          e_name=in.nextLine();
    }

    int search()
    {
        System.out.println("name to be searched"+" "+e_name);
        for(int i=0;i<name.length;i++){
         if(name[i].equals(e_name))
         return i;
      }
        return -1;
    }
}

public class Array {

    public static void main(String args[])
    {
        Work ob1=new Work();
        int search_res;
        ob1.name[0]="aditya";
        ob1.name[1]="ankit";

        ob1.getname();

        search_res=ob1.search();
        System.out.println(search_res);

        if(search_res!=-1)
        {
            System.out.println("name found");
        }
        else if (search_res==-1)
        {
            System.out.println("name not found");
        }
    }
}

エラー

   enter the name
     manoj
     Exception in thread "main" java.lang.NullPointerException
 at Work.search(Array.java:24)
 at Array.main(Array.java:56)
     name to be searched manoj
4

5 に答える 5

4

配列内のすべての値を繰り返し処理しています。nameその配列は次のようになります。

{ "aditya", "ankit", null, null, null, ... }

したがって、最初の2回の反復では問題ありませんが、その後、iが2の場合、次の行になります。

name[i].equals(e_name)

equalsを呼び出すnullので、例外です。

カプセル化、優れた設計などに関する問題は別として、この特定の問題に対する最もクリーンな修正は、次を使用することList<String>です。

List<String> names = new ArrayList<String>();

次に、これらの行:

ob1.name[0]="aditya";
ob1.name[1]="ankit";

次のようになります:

ob1.names.add("aditya");
ob1.names.add("ankit");

そして、あなたのループは次のようになります:

for (int i = 0; i < names.size(); i++) {
    if (names.get(i).equals(e_name)) {
        return i;
    }
}

または、配列を使用して、等価性チェックを逆にすることもできます。

if(e_name.equals(name[i]))

それe_nameが(実行方法で)nullになることは決してないので、これが例外をスローすることはありません。ただし、名前の数をハードコーディングするのは奇妙なことですが、より良いList<String>解決策になるでしょう。

于 2012-10-10T22:21:01.473 に答える
2

文字列配列(String name[]=new String [50];)をインスタンス化しましたが、最初のセルにのみ文字列を割り当てたため、最初の2つ()以外のインデックスname[i]を参照する場合は、nullポインタを参照しています。

于 2012-10-10T22:20:01.833 に答える
2

アレイは完全に実装されていますか?またはまったく入力されていますか?

 if(name[i].equals(e_name))

配列に50個の名前がない場合、上記のある時点equals()で、null参照を呼び出すことを意味します。nullチェックを実行する必要があります。

 if (e_name.equals(name[i]))

これは、配列が完全に入力されていない場合でも機能します(e_nameがnullでない場合)

于 2012-10-10T22:20:42.300 に答える
0

ここで50エントリの文字列配列を作成しましたString name[]=new String [50];が、初期化したのはそのうちの3つだけです(2つは直接、1つはob1.getname()

配列を(空の文字列などで)初期化するか、追加の変数で追跡してみてください...

于 2012-10-10T22:24:31.723 に答える
0

あなたのコードはnullとの比較につながるので、このエラーが発生します.String配列を使用する代わりに、コードに柔軟性を与えるため、ArrayListまたは他のコレクションを使用することをお勧めします。増加し、そのためには長さを何度も変更する必要があります。その場合、ArrayListが役立ちます。

于 2012-10-10T22:32:50.610 に答える