2017-03-04 29 views
-2

這是代碼。當我開始運行程序時,我輸入了選項1,它給了我一個錯誤,說明線程「main」java.lang.NullPointerException中的異常。任何幫助,將不勝感激。我正在努力找出爲什麼我得到一個空指針異常。我知道這是因爲空,但我似乎無法找到哪一個

的Database.txt應該是這樣的

510421600;Shelley;Morgan 
790701850;Holton;Jose 
932371897;Hynes;Naomi 
714797789;Kunkel;Dylan 
878566780;Grisham;Ellie 
810639750;Childs;Lillian 

代碼

import java.io.File; 

import java.util.Scanner; 

import java.io.*; 

public class ListExample 
{ 

    Node head; 
    Node tail; 

    public ListExample() 
    { 
     head = null; 
    } 

    public ListExample(Node head) 
    { 
     this.head = head; 
    } 

    //Load Database 
    public void Database() 
    { 
     head = null; 
     Node tmp = null; 
     Node lastFirst = tmp; 
     Node lastSecond = tmp; 
     Node lastThird = tmp; 

     for(int i = 9;i >= 0; i--) 
     { 
      String L1 = Integer.toString(i); 
      for(int j = 9;j >= 0; j--) 
      { 
       String L2 = Integer.toString(j); 
       for(int k = 9;k >= 0; k--) 
       { 

        String L3 = Integer.toString(k); 
        String allNum = L1 + L2 + L3 + "000000"; 

        tmp = new Node(allNum); 
        tmp.third = lastThird; 
        tmp.fourth = lastThird; 
        lastThird = tmp;  
       } 
       tmp.second = lastSecond; 
       lastSecond = tmp; 
      } 
      tmp.first = lastFirst; 
      lastFirst = tmp;  
     } 
     head = tmp; 
    } 

    //Inserting Skip Search 
    public void insertInSkip(String SSN, String lName, String fName) 
    { 

     Node tmp = head; 

     while((tmp != null) && SSN.charAt(0) >= tmp.first.SSN.charAt(0)) 
     { 
      tmp = tmp.first; 
     } 
     while((tmp != null) && SSN.charAt(1) >= tmp.second.SSN.charAt(1)) 
     { 
      tmp = tmp.second; 
     } 
     while((tmp != null) && SSN.charAt(2) >= tmp.third.SSN.charAt(2)) 
     { 
      tmp = tmp.third; 
     } 
     System.out.println(SSN); 
     System.out.println(tmp.fourth.SSN); 
     System.out.println(SSN.compareTo(tmp.fourth.SSN)); 
     while((tmp != null) && (SSN.compareTo(tmp.fourth.SSN) > 0)) 
     { 
      tmp = tmp.fourth; 
     } 
     if(SSN.compareTo(tmp.SSN) == 0) 
     { 
       return; 
     } 
     else 
     { 
      Node temp = new Node(SSN, fName, lName); 
      temp.fourth = tmp.fourth; 
      tmp.fourth = temp; 
     } 
     endTimer(); 
    } 

    // SkipSearch method 
    public void skipSearch(String SSN) 
    { 
     Node tmp = head; 

     while((tmp.first != null) && (SSN.charAt(0) < tmp.first.SSN.charAt(0))) 
     { 
      tmp = tmp.first; 
     } 
     while((tmp.second != null) && SSN.charAt(1) < tmp.second.SSN.charAt(1)) 
     { 
      tmp = tmp.second; 
     } 
     while((tmp.third != null) && SSN.charAt(2) < tmp.third.SSN.charAt(2)) 
     { 
      tmp = tmp.third; 
     } 
     while((tmp.fourth != null) && SSN.charAt(3) < tmp.fourth.SSN.charAt(3)) 
     { 
      tmp = tmp.fourth; 
     } 
     while(tmp.fourth != null) 
     { 
      tmp = tmp.fourth; 
      if(tmp.SSN.equals(SSN)) 
      { 
       System.out.println(tmp.toString()+"has been found."); 
       endTimer(); 
       System.out.println("Search took: " + timeElapsed()+ " seconds"); 
      } 
     } 

    } 

    // Read the file Database.txt 
    public void readFile(String data) 
    { 
     startTimer(); 
     File file = new File(data); 
     String firstName = " "; 
     int count = 0; 
     try 
     { 
      Scanner scanner = new Scanner(file); 
      while(scanner.useDelimiter(";") != null && scanner.hasNext()) 
      { 
       String ssn = scanner.next(); 
       String lastN = scanner.next(); 
       if(scanner.useDelimiter("\r") != null) 
       { 
        scanner.skip(";"); 
        String firstN = scanner.next(); 
        firstName = firstN; 
        if(scanner.hasNext()) 
        { 
         scanner.skip("\r"); 
         scanner.skip("\n"); 
        } 
       } 
       insertInSkip(ssn, firstName, lastN); 
       count++; 
       if(count % 1000 == 0) 
       { 
        System.out.print("."); 
       } 
      } 
      scanner.close(); 
      endTimer(); 
      System.out.println("Data loaded in " + timeElapsed() + " secs."); 
     } 
     catch(FileNotFoundException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    // End of program 
    public void endProg() 
    { 
     System.out.println("Program exiting.."); 
     System.exit(0); 
    } 

    public long startTimer() 
    { 
     return System.currentTimeMillis(); 
    } 

    public long endTimer() 
    { 
     return System.currentTimeMillis(); 
    } 

    public float timeElapsed() 
    { 
     return (endTimer() - startTimer())/1000; 
    } 

    //run the program 
    public void run(ListExample list) 
    { 
     Scanner scanner = new Scanner(System.in); 
     int option; 
     System.out.println("Select an option: "); 
     System.out.println("1. Load database\n2. Skip Search\n3. Exit "); 
     option = scanner.nextInt();  
     while(true) 
     { 
      switch(option) 
      { 
      case 1: 

       list.Database(); 
       list.readFile("Database.txt"); 
       break; 

      case 2: 
       System.out.println("Enter SSN: "); 
       String ssn2 = scanner.next(); 
       list.skipSearch(ssn2);     
       break; 

      case 3: 
       endProg(); 
       break; 

      default: 
       System.out.println("Incorrect value entered. Please enter a number between 1 and 3."); 
       System.out.println("Select an option: "); 
       System.out.println("1. Load database\n2. Skip Search\n3. Exit "); 
       option = scanner.nextInt(); 
       break; 
      } 
     System.out.println("Select an option: "); 
     System.out.println("1. Load database\n2. Skip Search\n3. Exit "); 
     option = scanner.nextInt(); 

     } 
    } 

    public static void main(String[] args) { 
     ListExample list = new ListExample(); 
     list.run(list); 
    } 
} 


Node.java 


public class Node { 

    public String SSN, fName, lName, allNum; 
    public Node first; 
    public Node second; 
    public Node third; 
    public Node fourth; 
    public Node head, tail, next; 

    public Node(String allNum){ 
     this.allNum = allNum; 
    } 
    public Node(String SSN, String fName, String lName){ 
     this.SSN = SSN; 
     this.fName = fName; 
     this.lName = lName; 
    } 

} 
+1

你是知道的事實, 「查找我的NullPointerException異常」問題會很快得到解決,但你沒有告訴我們你的錯誤是什麼。請告訴我們你的堆棧跟蹤。 – byxor

+0

您是否嘗試調試您的代碼? – Maverick

回答

0

我已經調試你的代碼。所以看線

while((tmp != null) && SSN.charAt(0) >= tmp.first.SSN.charAt(0)) 

tmp.first.SSN給NULL,和你想從它那裏得到的charAt。檢查它:

System.out.println(tmp.first.SSN); 

所以你可以添加一些條件來防止這種異常。

看看你insertInSkip方法:

//Inserting Skip Search 
    public void insertInSkip(String SSN, String lName, String fName) 
    { 

     Node tmp = head; 
//  System.out.println(tmp.first); 
//  System.out.println(tmp.second); 
//  System.out.println(tmp.third); 
//  System.out.println(tmp.first.SSN); 

     while((tmp != null) && (tmp.first.SSN != null) && SSN.charAt(0) >= tmp.first.SSN.charAt(0)) // changed 
     { 
      tmp = tmp.first; 
     } 

     while((tmp != null) && (tmp.second.SSN != null) && SSN.charAt(1) >= tmp.second.SSN.charAt(1)) // changed 
     { 
      tmp = tmp.second; 
     } 

     while((tmp != null) && (tmp.third.SSN != null) && SSN.charAt(2) >= tmp.third.SSN.charAt(2)) // changed 
     { 
      tmp = tmp.third; 
     } 
     System.out.println("ssn="+SSN); 
     System.out.println(tmp.fourth.SSN); 
     if (tmp.fourth.SSN != null){ // changed 
      System.out.println(SSN.compareTo(tmp.fourth.SSN)); 
     } 

     while((tmp != null) && (tmp.fourth.SSN != null) && (SSN.compareTo(tmp.fourth.SSN) > 0)) // changed 
     { 
      tmp = tmp.fourth; 
     } 
     if(SSN.equals(tmp.SSN)) 
     { 
       return; 
     } 
     else 
     { 
      Node temp = new Node(SSN, fName, lName); 
      temp.fourth = tmp.fourth; 
      tmp.fourth = temp; 
     } 
     endTimer(); 
    } 

下面是輸出:

Select an option: 
1. Load database 
2. Skip Search 
3. Exit 
1 
ssn=510421600 
null 
ssn=790701850 
510421600 
2 
ssn=932371897 
510421600 
4 
ssn=714797789 
510421600 
2 
ssn=878566780 
510421600 
3 
ssn=810639750 
510421600 
3 
Data loaded in 0.0 secs. 
Select an option: 
1. Load database 
2. Skip Search 
3. Exit 

UPD SkipSearch:

// SkipSearch method 
public void skipSearch(String SSN) 
{ 
    Node tmp = head; 
    //System.out.println(tmp); 

    if (tmp != null) { 
     while((tmp.first != null) 
       && (tmp.first.SSN != null) 
       && (SSN.charAt(0) < tmp.first.SSN.charAt(0)) 
       ) 
     { 
      tmp = tmp.first; 
     } 
     while((tmp.second != null) 
       && (tmp.second.SSN != null) 
       && SSN.charAt(1) < tmp.second.SSN.charAt(1)) 
     { 
      tmp = tmp.second; 
     } 
     while((tmp.third != null) 
       && (tmp.third.SSN != null) 
       && SSN.charAt(2) < tmp.third.SSN.charAt(2)) 
     { 
      tmp = tmp.third; 
     } 
     while((tmp.fourth != null) 
       && (tmp.fourth.SSN != null) 
       && SSN.charAt(3) < tmp.fourth.SSN.charAt(3)) 
     { 
      tmp = tmp.fourth; 
     } 
     while(tmp.fourth != null) 
     { 
      tmp = tmp.fourth; 
      if(tmp.SSN.equals(SSN)) 
      { 
       System.out.println(tmp.toString()+"has been found."); 
       endTimer(); 
       System.out.println("Search took: " + timeElapsed()+ " seconds"); 
      } 
     } 
    } 
} 
+0

謝謝,它確實工作!你有什麼想法爲什麼不是SkipSearch方法工作(這是選項2)? – Daniel

+0

感謝您接受答案。這是同樣的問題。變量tmp給NULL,你得到異常。我已經更新了答案。但是,您應該明白這些答案只是防止出現異常。我認爲,爲了適應您的業務邏輯(或技術任務),您最好改變這一決定。如果你得到異常,你應該看看堆棧跟蹤,異常的特徵和它出現在哪一行。謝謝。 –

相關問題