2017-02-20 22 views
-2

分数をソートするBSTを作成しようとしています。 のTreeNodeクラスnullポインタ例外がある

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

そのような何か:あなたのcompareTo方法は、単に、パラメータFractions fは、このようにf == null場合は、nullでないことを確認していません

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

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

たりしますf.evaluate()に電話をかけようとすると、への参照がないため、NullPointerException(NPE)が送出されますevaluate()を呼び出すオブジェクト。

代わりに、この最初のを確認するためにあなたのif条件を更新:

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

同じことがあなたのinsert方法となります。ヌルである小数部を挿入できるはずですか?私はそうは思わない。

+0

null分数のチェックを追加する良いですが、分数はnullであってはいけません...なぜそれがnullであるのか分かりません。挿入メソッドはforループによって呼び出され、断片の配列を通過します。これらすべての分数は、すべて適切にインスタンス化する必要があります。 – WinDows

+0

デバッガ(IDEまたはEclipseまたはIntelliJのもの)を使用し、コール時にブレークポイントを設定します。 – xlm

+0

@WinDowsでは、あなたのQを編集し、挿入の具体化について追加のコードを投稿します。 – xlm