Пересечение BST, исключение NullPointerException - PullRequest
0 голосов
/ 20 апреля 2011

Я пытаюсь создать новый BST на пересечении 2 известных BST.Я получаю NullPointerException в методе intersect2 во втором случае, в строке "cur3.item.set_account_id (cur1.item.get_accountid () + cur2.item.get_accountid ());".Я знаю, что вы получаете ошибку, когда вы пытаетесь разыменовать переменную без ее инициализации, но я думаю, что я инициализирую ее?Я не совсем уверен.Буду признателен за помощь.

public static Bst<Customer> intersect(Bst<Customer> a, Bst<Customer> b){
     return( intersect2(a.root, b.root));
 }

  public static Bst<Customer> intersect2(BTNode<Customer> cur1, BTNode<Customer> cur2){
  Bst<Customer> result = new Bst<Customer>();

// 1. both empty -> true
  if (cur1==null && cur2==null){
  result=null;
 }
// 2. both non-empty -> compare them
 else if (cur1!=null && cur2!=null) {
  BTNode<Customer> cur3 = new BTNode<Customer>();
  cur3.item.set_account_id(cur1.item.get_accountid()+ cur2.item.get_accountid());
  result.insert(cur3.item);
  intersect2(cur1.left, cur2.left);
  intersect2(cur1.right, cur2.right);
 }

// 3. one empty, one not -> false
else if (cur1==null ||cur2==null){
  BTNode<Customer> cur3 = new BTNode<Customer>();
  cur3.item=null;
  intersect2(cur1.left, cur2.left);
  intersect2(cur1.right, cur2.right);
}
 return result;
}

Вот изображение проблемы: enter image description here

Ответы [ 3 ]

1 голос
/ 21 апреля 2011

Исключение NullPointerException может быть вызвано несколькими причинами. В данном примере cur1 и cur2 не являются нулевыми, но нет гарантии, что cur1.item, cur1.item.accountId (и аналогично для cur2) не равны null.

Поскольку у вас нет описания базовой реализации, я не могу помочь в дальнейшем. Я могу предложить вам сделать несколько вещей:
1.) проверьте реализацию ваших объектов (если это происходит КАЖДЫЙ раз, может быть какая-то проблема инициализации.
2.) Каждый раз, когда вы создаете экземпляр вашего элемента, вы обязательно указываете поле accountId? Попробуйте указать значение по умолчанию для этого поля, чтобы оно не могло быть нулевым. (попробуйте какое-нибудь недопустимое значение [например, -1, false и т. д.] и проверьте его.

Если вы опубликуете больше подробностей реализации, я (или кто-то другой), возможно, смогу напрямую определить проблему.

Привет.

Редактирование: 4/20 @ 17: 11 Вот пример того, что вы должны делать.

public class Customer {  
    private int accountId;  

    public Customer() {  
        this.accountId = 0;  
    }  

    public Customer(int account_identification) {  
        this.accountId = account_identification);  
    }  

    //As a side note, general practice implies fields be private  
    //Use a method (hence the term 'getter' and the reciprocal, 'setter')  
    public int getId() {  
        return this.accountId;  
    }  

    public void setId(int replacement_account_identification) {  
        this.accountId = replacement_account_identification;  
    }
}
0 голосов
/ 21 апреля 2011

При создании BTNode автоматически выделяется его член item?

Вы делаете:

cur3.item.set_account_id(.. )

Чтобы это было успешным, оба значения: cur3 и cur3.item не должны бытьnull.

То же самое относится и к cur1 и cur2, на которые вы ссылаетесь позже в этой строке.

И пример 3-го случая показывает, что BTNode.item может быть нулевымв некоторых сценариях:

cur3.item=null;
0 голосов
/ 20 апреля 2011

Это потому, что переменная элемента в объекте Customer не инициализирована.

...