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]))