java中的字符串搜索(获取java.lang.nullpointerexception)

java中的字符串搜索(获取java.lang.nullpointerexception),java,Java,我编写了一个简单的程序,其中有一个包含名称的字符串数组 此程序在字符串数组中搜索用户给定的名称。如果它存在,则会显示名称已找到,否则未找到 当我给出名称时,即字符串中已存在,则程序工作正常,但当我给出名称时,即字符串中不存在,则显示错误 import java.util.Scanner; class Work { Scanner in = new Scanner(System.in); String e_name; String name[]=new String

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

此程序在字符串数组中搜索用户给定的名称。如果它存在,则会显示
名称已找到
,否则
未找到

当我给出名称时,即字符串中已存在,则程序工作正常,但当我给出名称时,即字符串中不存在,则显示错误

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");
        }
    }
}

您实例化了字符串数组(
String name[]=new String[50];
),但只将字符串分配给其中的第一个单元格,因此当您引用前两个(
name[i]
)之外的索引时,您引用的是空指针。

数组是否已完全填充?还是有人居住

 if(name[i].equals(e_name))
如果您的数组没有50个名称,那么在某个点上,上述内容将意味着您对空引用调用
equals()
。您应该执行空检查,或者更确切地说:

 if (e_name.equals(name[i]))
即使您的数组没有完全填充(假设e_
name
不是空的)

您正在迭代
name
数组中的每个值,它也会工作。该数组如下所示:

{ "aditya", "ankit", null, null, null, ... }
因此,对于前两个迭代,这将是好的-但在那之后,当我2岁时,这一行:

name[i].equals(e_name)
将在
null
上调用
equals
,因此出现异常

撇开封装、良好设计等问题不谈,对于这个特殊问题最干净的解决方法是使用
列表

将成为:

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;
    }
}
你的循环会变成:

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;
    }
}

考虑到
e_name
永远不会为null(以您运行它的方式),这将永远不会引发异常。但是,名称的硬编码数量仍然很奇怪-一个
列表将是一个更好的解决方案。

您在这里创建了一个包含50个条目的字符串数组
字符串名称[]=新字符串[50]
但您只初始化了其中的3个(2个直接初始化,1个通过
ob1.getname()


尝试初始化数组(使用空字符串或其他什么),或使用额外的变量跟踪它…

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

我必须实例化数组中的完整50个元素吗
for (int i = 0; i < names.size(); i++) {
    if (names.get(i).equals(e_name)) {
        return i;
    }
}
if(e_name.equals(name[i]))