0

我编写了一个简单的程序,其中有一个包含名称的字符串数组。

该程序在字符串数组中搜索用户给定的名称。如果它存在,那么它会说name foundelse 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, ... }

所以对于前两次迭代,它会很好 - 但在那之后,当 i 为 2 时,这一行:

name[i].equals(e_name)

将调用equalson 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永远不会为空(以您运行它的方式),这永远不会引发异常。不过,硬编码的名称数量仍然很奇怪——aList<String>将是一个更好的解决方案。

于 2012-10-10T22:21:01.473 回答
2

您实例化了字符串数组String name[]=new String [50];name[i]

于 2012-10-10T22:20:01.833 回答
2

您的阵列是否已完全填充?还是根本没有人口?

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

如果您的数组没有 50 个名称,那么在某些时候上述将意味着您调用equals()空引用。您应该执行空检查,或者更确切地说:

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

即使您的数组没有完全填充,它也可以工作(假设 e_name不为空)

于 2012-10-10T22:20:42.300 回答
0

您的代码导致与 null 进行比较,这就是您收到此错误的原因。我建议不要使用字符串数组,而是使用 ArrayList 或任何其他集合,因为这样可以为代码提供灵活性。因为您的数据库可能是增加,为此您必须一次又一次地更改长度。ArrayList 在这种情况下很有用。

于 2012-10-10T22:32:50.610 回答
0

好吧,您在这里创建了一个包含 50 个条目的字符串数组,String name[]=new String [50];但您只初始化了其中的 3 个(直接 2 个,由 1 个ob1.getname()

尝试初始化您的数组(使用空字符串或其他)或使用额外的变量来跟踪它...

于 2012-10-10T22:24:31.723 回答