2017-02-20 76 views
-2

試圖創建一個對分數進行排序的BST。 樹節點類具有空指針異常

public class TreeNode<E> { 
protected E element; 
protected TreeNode<E> left; 
protected TreeNode<E> right; 
public TreeNode(E e){ 
    element = e; 
} 
} 

的部分類...

import java.util.ArrayList; 
import java.util.Stack; 

public class Fractions { 
private String fractionS; 
private ArrayList<String> tokenArray; 
public Fractions(String s){ 
    this.fractionS = s; 
} 

public String toString(){ 

    return fractionS; 

} 

public String extractNumber(int n, String s){ 
    String num = new String(); 
    char c; 
    for (int i = n; i<s.length(); i++){ 
     c = s.charAt(i); 
     if (c >= '0' && c <= '9'){ 
      num+=String.valueOf(c); 
     }else{ 
      break; 
     } 
    } 
    return num; 
} 

public Double getNumbers(){ 
    char c; 
    Stack<String> numStack = new Stack<String>(); 
    for (int i = 0; i<this.fractionS.length(); i++){ 
     c = this.fractionS.charAt(i); 
     if (c >= '0' && c<= '9'){ 
      numStack.push(extractNumber(i, this.fractionS)); 
      i += numStack.peek().length()-1; 
     } 
    } 
    Double denominator = Double.parseDouble(numStack.pop()); 
    Double numerator = Double.parseDouble(numStack.pop()); 
    Double solution = numerator/denominator; 
    return solution; 
} 


public int compareTo(Fractions f) { 
    Double d1 = this.getNumbers(); 
    Double d2 = f.getNumbers(); 
    if (d1<=d2){ 
     return 1; 
    }else{ 
    return 0; 
    } 
} 

我在電話會議上對compareTo方法得到了NullPointerException。試圖找出NullPointerException。我可以自己做剩下的事情。這是一堂課,我不想惹麻煩。

包括分數的實例... 我還對分數類進行了更改。

public void createTree(){ 
tokenizer(); 
Stack<String> numbers = new Stack<String>(); 
int count = 0; 
for (int i = 0; i<tokenArray.size(); i++){ 
    char c = tokenArray.get(i).charAt(0); 
    if (c == '/'){ 
     count+= 1; 
    }else if (c >= '0' && c <= '9'){ 
     numbers.push(tokenArray.get(i)); 
    } 
} 
for (int i = 0; i <count; i++){ 
    String denominator = numbers.pop(); 
    String numerator = numbers.pop(); 
    insert(new Fractions(numerator + "/" + denominator)); 
} 
+1

A)使用java標籤來表明你有一個Java問題......但實際上B)做了以前的研究,比如......只是尋找那個例外名...... – GhostCat

回答

1

做這樣的事情:

boolean left = false; 
    parent = current = root; 
    while (current!=null){ 
     if (left = (f.compareTo(current.element) == 1)){ 
      parent = current; 
      current = current.left; 
     }else{ 
      parent = current; 
      current = current.right; 
     } 
    } 
    if (left){ 
     parent.left = new TreeNode<Fractions>(f); 
    }else{ 
     parent.right = new TreeNode<Fractions>(f); 
    } 

甚至:

boolean left = false; 
    current = root; 
    do { 
     left = f.compareTo(current.element) == 1; 
     parent = current; 
     if (left){ 
      current = current.left; 
     }else{ 
      current = current.right; 
     } 
    } while (current!=null); 
    if (left){ 
     parent.left = new TreeNode<Fractions>(f); 
    }else{ 
     parent.right = new TreeNode<Fractions>(f); 
    } 
0

compareTo方法根本沒有檢查該參數Fractions f不爲空,因此,如果f == null,當它試圖呼叫f.evaluate()時,它會拋出NullPointerException(NPE),因爲它沒有提及Fractions要呼叫evaluate()的對象。

而是更新if條件來檢查這個第一:

if (f != null && this.evaluate() <= f.evaluate()) { 
    // ... 
} 

這同樣與insert方法。你應該能夠插入一個零值?我不這麼認爲。

+0

添加一個空分數的檢查將是好,但分數不應該爲空...我不明白爲什麼它是空的。插入方法被一個for循環所調用,它經歷了分數的數組列表。所有這些分數都應該正確實例化。 – WinDows

+0

使用調試器(從您的IDE即Eclipse或IntelliJ)並在呼叫中設置斷點。 – xlm

+0

@WinDows您編輯您的Q併發布插入的實例化附加代碼。 – xlm