代码之家  ›  专栏  ›  技术社区  ›  Hector

从arraylist创建treeset时,什么导致了NPE?

  •  1
  • Hector  · 技术社区  · 7 年前

    WildFly Full 12.0.0.Final (WildFly Core 4.0.0.Final)
    jdk1.8.0_121
    [org.jboss.weld.Version] (MSC service thread 1-2) WELD-000900: 3.0.3 (Final)
    

    public class KeywordPersist implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        private final String doi;
        private final List<String> keywords = new ArrayList<>();
    
        public KeywordPersist(final String doi, final List<String> keywords) {
            super();
            this.doi = doi;
            this.keywords.clear();
            this.keywords.addAll(keywords);
        }
    
    //Getters, Setters, Hashcode, equals, toString NOT shown
    
    }
    

    我将它注入到无状态EJB中

    @Inject
    Event<KeywordPersist> keywordPersistEvent;
    

    if ((result.getKeywordList() == null) || (result.getKeywordList().getKeyword() == null) || result.getKeywordList().getKeyword().isEmpty()) {
                return;
            }
    
            keywordPersistEvent.fire(generateKeywordEvent(result));
    

    我生成事件数据如下:

    private KeywordPersist generateKeywordEvent(final Result result) {
        final KeywordPersist keywordPersist = new KeywordPersist(result.getDoi(), new ArrayList<String>(result.getKeywordList().getKeyword()));
        return keywordPersist;
    }
    

    @Asynchronous
    @Transactional(TxType.REQUIRES_NEW)
    @Lock(LockType.WRITE)
    public void parse(@Observes final KeywordPersist keywordPersist) {
        persistDoiKeyword(keywordPersist);
    }
    

    持久方法类似于:

    /**
     * 
     * @param result
     */
    private void persistDoiKeyword(final KeywordPersist keywordPersist) {
    
        if (keywordPersist == null) {
            System.out.println("---------------------------- persistDoiKeyword() if (keywordPersist == null) {}");
            throw new RuntimeException("Never can happen 0000");
        }
    
        if (keywordPersist.getDoi() == null) {
            System.out.println("---------------------------- persistDoiKeyword() if (keywordPersist.getDoi() == null) {}");
            throw new RuntimeException("Never can happen 0001");
        }
    
        if (keywordPersist.getKeywords() == null) {
            System.out.println("---------------------------- persistDoiKeyword() if (keywordPersist.getKeywords()== null) {}");
            throw new RuntimeException("Never can happen 0002");
        }
    
        if (keywordPersist.getKeywords().isEmpty()) {
            System.out.println("---------------------------- persistDoiKeyword() if (keywordPersist.getKeywords().isEmpty()) {}");
            throw new RuntimeException("Never can happen 0003");
        }
    
        final Set<String> uniqueKeywordsSet = new TreeSet<>(keywordPersist.getKeywords());
        final List<String> uniqueKeywords = new ArrayList<>(uniqueKeywordsSet);
    
        long rowCount = 0;
    
        for (String keyword : uniqueKeywords) {
    
            final DoiKeyword doiKeyword = new DoiKeyword();
            doiKeyword.setKeywordDoi(keywordPersist.getDoi());
            doiKeyword.setKeyword(cleanse(keyword));
    
            entityManager.persist(doiKeyword);
    
            rowCount++;
    
            if ((rowCount % 20) == 0) {
                entityManager.flush();
                entityManager.clear();
            }
        }
    
        entityManager.flush();
        entityManager.clear();
    }
    

    Caused by: java.lang.NullPointerException
        at java.util.TreeMap.put(TreeMap.java:563)
        at java.util.TreeSet.add(TreeSet.java:255)
        at java.util.AbstractCollection.addAll(AbstractCollection.java:344)
        at java.util.TreeSet.addAll(TreeSet.java:312)
        at java.util.TreeSet.<init>(TreeSet.java:160)
        at com.research.events.observers.KeywordPersistObserver.persistDoiKeyword(KeywordPersistObserver.java:66)
        at com.research.events.observers.KeywordPersistObserver.parse(KeywordPersistObserver.java:37)
        at sun.reflect.GeneratedMethodAccessor62.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.jboss.as.ee.component.ManagedReferenceMethodInterceptor.processInvocation(ManagedReferenceMethodInterceptor.java:52)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422)
        at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:509)
    

    这个NPE是从哪里来的?

    1 回复  |  直到 7 年前
        1
  •  4
  •   davidxxx    7 年前

    null 引用不允许出现在 TreeSet

    TreeSet.add(E e) 有序树

    ……

    NullPointerException

    String.compareTo() 也接受
    无效的

    TreeSet<String> set = new TreeSet<>(Comparator.nullsFirst(Comparator.naturalOrder());