TreeSet在使用自定义比较器时抛出空指针异常。

huangapple go评论96阅读模式
英文:

TreeSet throws nullpointer exception when using custom comparator

问题

以下是您提供的代码段的翻译部分:

  1. 我在尝试从TreeSet中删除特定元素null时遇到了错误消息我不确定为什么会发生这种情况我尝试使用contains方法检查集合中是否已经存在相同的元素这样可以正常工作异常在调用reset方法时抛出
  2. java.lang.NullPointerException
  3. 在第55Leaderboard$1.compare
  4. 在第52Leaderboard$1.compare
  5. 在第374java.base/java.util.TreeMap.getEntryUsingComparator
  6. 在第343java.base/java.util.TreeMap.getEntry
  7. 在第601java.base/java.util.TreeMap.remove
  8. 在第276java.base/java.util.TreeSet.remove
  9. 在第86Leaderboard.reset
  10. 在第71__Driver__.__helperSelectMethod__
  11. 在第91__Driver__.__helper__
  12. 在第112__Driver__.main
  13. > 这是我的代码
  14. class Leaderboard {
  15. TreeSet<Integer> TS;
  16. HashMap<Integer, Integer> HS = new HashMap<>();
  17. public Leaderboard() {
  18. TS = new TreeSet<>(new Comparator<Integer>(){
  19. @Override
  20. public int compare(Integer a, Integer b){
  21. if(HS.get(a).equals(HS.get(b))){
  22. return Integer.compare(a, b);
  23. }
  24. return HS.get(a).compareTo(HS.get(b));
  25. }
  26. });
  27. }
  28. public void addScore(int playerId, int score) {
  29. HS.put(playerId, HS.getOrDefault(playerId, 0) + score);
  30. TS.add(playerId);
  31. TreeSet<Integer> test = TS;
  32. HashMap<Integer, Integer> test2 = HS;
  33. }
  34. public int top(int K) {
  35. Iterator<Integer> iterator = TS.iterator();
  36. int res = 0;
  37. while(K > 0 && iterator.hasNext()){
  38. res += HS.get(iterator.next());
  39. K--;
  40. }
  41. return res;
  42. }
  43. public void reset(int playerId) {
  44. Integer id = new Integer(playerId); //尝试过,无效
  45. System.out.println(HS.containsKey(id)); // true
  46. System.out.println(TS.contains(id)); // true
  47. HS.remove(id);
  48. TS.remove(id);
  49. }
  50. }
  51. /**
  52. * 将实例化您的Leaderboard对象,并按以下方式调用:
  53. * Leaderboard obj = new Leaderboard();
  54. * obj.addScore(playerId, score);
  55. * int param_2 = obj.top(K);
  56. * obj.reset(playerId);
  57. */
英文:

I got an error msg when I trying to remove a specific element in treeset (not null). I'm not sure why this happened, and I tried to use contains to check if there has the same element in the set already which would work fine. The exception throws when calling reset method.

  1. java.lang.NullPointerException
  2. at line 55, Leaderboard$1.compare
  3. at line 52, Leaderboard$1.compare
  4. at line 374, java.base/java.util.TreeMap.getEntryUsingComparator
  5. at line 343, java.base/java.util.TreeMap.getEntry
  6. at line 601, java.base/java.util.TreeMap.remove
  7. at line 276, java.base/java.util.TreeSet.remove
  8. at line 86, Leaderboard.reset
  9. at line 71, __Driver__.__helperSelectMethod__
  10. at line 91, __Driver__.__helper__
  11. at line 112, __Driver__.main

> Here is my code:

  1. class Leaderboard {
  2. TreeSet&lt;Integer&gt; TS;
  3. HashMap&lt;Integer, Integer&gt; HS = new HashMap&lt;&gt;();
  4. public Leaderboard() {
  5. TS = new TreeSet&lt;&gt;(new Comparator&lt;Integer&gt;(){
  6. @Override
  7. public int compare(Integer a, Integer b){
  8. if(HS.get(a).equals(HS.get(b))){
  9. return Integer.compare(a, b);
  10. }
  11. return HS.get(a).compareTo(HS.get(b));
  12. }
  13. });
  14. }
  15. public void addScore(int playerId, int score) {
  16. HS.put(playerId, HS.getOrDefault(playerId, 0) + score);
  17. TS.add(playerId);
  18. TreeSet&lt;Integer&gt; test = TS;
  19. HashMap&lt;Integer, Integer&gt; test2 = HS;
  20. }
  21. public int top(int K) {
  22. Iterator&lt;Integer&gt; iterator = TS.iterator();
  23. int res = 0;
  24. while(K &gt; 0 &amp;&amp; iterator.hasNext()){
  25. res += HS.get(iterator.next());
  26. K--;
  27. }
  28. return res;
  29. }
  30. public void reset(int playerId) {
  31. Integer id = new Integer(playerId); //tried, not work
  32. System.out.println(HS.containsKey(id)); // true
  33. System.out.println(TS.contains(id)); // true
  34. HS.remove(id);
  35. TS.remove(id);
  36. }
  37. }
  38. /**
  39. * Your Leaderboard object will be instantiated and called as such:
  40. * Leaderboard obj = new Leaderboard();
  41. * obj.addScore(playerId,score);
  42. * int param_2 = obj.top(K);
  43. * obj.reset(playerId);
  44. */

答案1

得分: 0

如@VGR所提到的:
您确定在您的比较方法中HS.get(a)永远不会返回null吗?

这是因为TreeMap是基于HashMap进行比较的。如果使用HS.remove(a)删除了HS的值,无论何时treemap调用HS.get(a),都会返回null作为返回值。当在比较中为HS.get(a).compareTo调用时,将会是null.compareTo,这就是抛出空指针异常的原因。

英文:

As @VGR mentioned:
Are you certain that HS.get(a) never returns null in your compare method?

This is because that the TreeMap is based on HashMap to compare. If delete the HS value using HS.remove(a), whenever the treemap call HS.get(a) there will be a null as return value. which when called in compare for HS.get(a).compareTo will be null.compareTo, and this is the reason that throws an NullPointerException.

huangapple
  • 本文由 发表于 2020年9月25日 07:22:53
  • 转载请务必保留本文链接:https://go.coder-hub.com/64055697.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定