我在从队列中删除元素时遇到问题.通过广泛的调试,我发现所有元素都被添加,但是当我尝试删除它时,它会一遍又一遍地给我相同的元素.这是代码:
private synchronized String accessMyQueue(char[] myInput) {
String myOutput="";
myOutput=convertToString(myQueue.remove());
System.out.println("accessqueue removing:" + myOutput);
}
//and so you can see what's going on in convertToString...
private String convertToString(char[] a) {
String myString = new String(a);
return myString.trim();
}
Run Code Online (Sandbox Code Playgroud)
如果myQueue是实现Queue接口的标准Java类的实例,那么您发现它的错误的机会是......好吧,接近于零,我们可以将其作为一种可能性进行折扣.
另一方面,如果你已经实现了自己的队列,那么,是的,可能存在问题,但是,由于通灵调试还不是一个成熟的领域,你将不得不向我们展示代码:-)
我看到两种可能性中的一种.第一个是你以某种方式将队列的每个节点设置为相同的值,你可能正好删除项目(你可以通过添加一个项目然后尝试删除两个来检测这一点).这种情况更可能出现在像C这样的语言中,你可能会无意中重用相同的指针,但在Java中改进字符串的可能性要小得多.
第二个也是最有可能的是你在调用时没有从队列中删除元素remove,而是在不调整底层数据结构的情况下返回字符串(或者,错误地调整它).
没有看到代码,那就和我能做的一样好.
在你确实使用的更新后LinkedList,我想我会用一个非常简单的例子给它一个镜头xx.java:
import java.util.LinkedList;
import java.util.Queue;
public class xx {
public static void main (String args[]) {
Queue<String> myQueue = new LinkedList<String>();
myQueue.add ("abc");
myQueue.add ("def");
System.out.println (myQueue.size());
System.out.println (myQueue.remove());
System.out.println (myQueue.size());
System.out.println (myQueue.remove());
System.out.println (myQueue.size());
try {
System.out.println (myQueue.remove());
} catch (Exception e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这输出:
2
abc
1
def
0
java.util.NoSuchElementException
at java.util.LinkedList.remove(LinkedList.java:805)
at java.util.LinkedList.removeFirst(LinkedList.java:151)
at java.util.LinkedList.remove(LinkedList.java:498)
at xx.main(xx.java:14)
Run Code Online (Sandbox Code Playgroud)
正如所料.
所以,最重要的是,我认为我们需要看到更多的代码.这是很难想象的是,如果是在一个错误LinkedList或Queue接口,它不会被成千上万的其他用户发现尚未:-)
您还想尝试将System.out.println (myQueue.size());代码放在代码中的几个重要位置,以查看队列中发生的情况.这可能会告诉您发生了什么.