如何在服用前检查BlockingQueue头部元素?

时间:2013-04-22 13:11:44

标签: java multithreading producer-consumer blockingqueue

我想在服用之前检查一个头部元素但是提高了 窥视时java.lang.NullPointerException

使用java BlockingQueue

 BlockingQueue sharedQueue = new LinkedBlockingQueue()

这是我的代码,任何想法?

while(true){
    try {
        if(!sharedQueue.isEmpty()){
            char  ch = (char)sharedQueue.peek();
            if(Character.isDigit(ch)){
                digitTextField.setText(digitTextField.getText()+sharedQueue.take());
            }
        }
    } catch (InterruptedException ex) {
        Logger.getLogger(Form.class.getName()).log(Level.SEVERE, null, ex);
    }
}

2 个答案:

答案 0 :(得分:4)

这是因为您正在向char投射不允许空值。此外,不要sharedQueue.isEmpty()后跟peek - 这被称为“check-then-act”,这是众所周知的种族原因。

您应该将sharedQueue定义为BlockingQueue<Character>,然后使用

if ((Character c = sharedQueue.poll()) != null)

答案 1 :(得分:1)

未找到元素时,

peek()会返回null

  

返回:此队列的头部,如果此队列为空,则返回null

您需要使用:

    if(ch != null && Character.isDigit(ch)){