2012-10-10 41 views
0

我已經寫了一個簡單的程序,其中有包含名稱的字符串數組。字符串搜索(讓顯示java.lang.NullPointerException)

該程序搜索由字符串數組中的用戶給出的名稱。如果存在,那麼它說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

你遍歷值在name陣列中。該數組是這樣的:

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

所以前兩個迭代,它會被罰款 - 但在這之後,當我是2,這條線:

name[i].equals(e_name) 

將在調用equalsnull,因此是例外。

撇開關於封裝,良好的設計等有關的問題,乾淨修復這個特殊問題是使用一個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永遠不會爲空(與方式你正在運行它),這永遠不會拋出異常。它仍然是奇怪,有名稱的硬編碼的數字,但 - 一個List<String>會是一個更好的解決

+0

感謝它爲我實例化整整50元素數組中.. –

2

您實例化的String數組(String name[]=new String [50];),但只在其指定字符串第一個細胞,所以當您參考,以指數以外的前兩個( name[i])你引用一個空指針。

+0

我一定 –

2

是您的陣列完全填充?或者根本沒有人口?

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

如果陣列沒有50名,然後在某個點以上將意味着你在一個空引用調用equals()。您應該執行空校驗或者說:

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

如果你的陣列是不是完全填充這甚至會工作(假設E_ name不爲null)

0

嗯,你在這裏創建一個字符串數組有50項String name[]=new String [50];但只(由ob1.getname() 2直接,1)

嘗試初始化您的數組(與任何空字符串或)或跟蹤它初始化,其中3人有一個額外的變量...

0

您的代碼導致與空的比較,這就是爲什麼你收到此error.I會建議,而不是使用一個String數組,使用ArrayList或者任何其他集合因爲這樣可以給到因爲您的數據庫可能會增加,因此您必須一次又一次更改長度.ArrayList在這種情況下非常有用。