public synchronized Map getMap(){
        if(listss.size()==0){
            return null;
        }else{
            return listss.remove(0);  // 这里的remove会使得共享的listss一直减少到到0个元素,这样就返回了null
        }
    }最后当你调用以下语句的时候,就会出现NPE了
Map m = getMap(); // 这里得到的m已经是null了
String url = m.get("URL").toString();  // NPE会发生

解决方案 »

  1.   

    首先public synchronized Map getMap(){是线程安全的因为remove 最中会执行到
    if(listss.size()==0){
                return null;你下面又没判断 null ,当然就出错了
    public void run() {
                while(true){
                    Map m = getMap();
                    if (m == null)   // 加上判断
                        break;
                    String url = m.get("URL").toString();
                    String id = m.get("ID").toString();
                    if(m != null){
                        try {
    //                        byte[] b = downloadForHttp(url);
                            System.out.println("更新成功...");
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }