2017-02-20 5 views
-2

Пытается создать BST, который сортирует фракции. TreeNode классаИсключение исключений нулевого указателя

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

Я получаю NullPointerException на вызов для compareTo метода. Просто пытаюсь выяснить, 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, который проходит через arraylist фракций. Все эти фракции должны быть созданы правильно. – WinDows

+0

Используйте отладчик (из вашей IDE, например Eclipse или IntelliJ), и установите точку разрыва в вызове. – xlm

+0

@WinDows вы редактируете свой Q и размещаете дополнительный код при создании экземпляра. – xlm