ЛУЧШИЙ пересечения, NullPointerException

голоса
0

Я пытаюсь создать новый BST от пересечения 2-й известного BSTs. Я получаю 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;
}

Вот образ задачи: введите

Задан 20/04/2011 в 20:49
источник пользователем
На других языках...                            


3 ответов

голоса
0

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

Ответил 20/04/2011 в 20:53
источник пользователем

голоса
0

Позволит ли создание BTnode автоматически распределять свой член item?

Вы делаете:

cur3.item.set_account_id(.. )

Для этого , чтобы добиться успеха, как cur3и cur3.itemдолжен быть не нулевым.

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

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

cur3.item=null;
Ответил 20/04/2011 в 21:10
источник пользователем

голоса
1

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

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

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

С уважением.

Edit: 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;  
    }
}
Ответил 20/04/2011 в 21:11
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more