2016-09-18 4 views
1

Мне нужно создать класс для наследования Hashcode, и мне нужно переопределить метод contains.StackOverflowError при переопределении Hashtable.contains() java

@Override 
public boolean contains(Object value) { 
    if (!this.containsValue(value)) 
     return true; 
    return false; 
} 

public void add(Object key, Object value) { 
    if (!this.contains(value)) { 
     this.put(key, value); 
    } 
} 

Компиляция просто прекрасна, но когда я запускаю ее, я получаю StackOverflowError. Я думаю, что получаю некоторый рекурсивный бесконечный цикл, но я не могу понять это. Любая помощь приветствуется! printscreen of the error

+0

Ye, s это рекурсия, потому что вы просто вызываете 'contains' в' contains'. Если вы хотите вызвать расширенную версию, используйте 'super :: contains'. Но если вы просто вызываете версию метода базового класса, зачем вообще переопределять? – Robert

ответ

1

Вы звоните containsValue внутри contains, но глядя на код в HashTable вы можете увидеть, что containsValue будет вызывать contains снова, и это будет повторяться, пока вы не получите переполнение стека ...

В HashTable .class

public boolean containsValue(Object value) { 
    return contains(value); 
} 

Вы действительно должны делать это

@Override 
public boolean contains(Object value) { 
    if (!super.contains(value)) 
     return true; 
    return false; 
} 

Или просто не переопределяйте contains, потому что это уже делает то, что вы переопределяете.

+0

Спасибо, я написал содержит без использования containsValue, и он работал отлично. – CatalinGh