for(int i=0;i<urlVec.size();)
{

DownThread[] dt=new DownThread[threadNum];
for(int k=0;k<threadNum&&i<urlVec.size();)//一次建立threadNum个线程
{
URL urlTemp=urlVec.get(i);
DownThread t=new DownThread(urlTemp,pageVec);
dt[k]=t;//存入dt数组
t.run();
++i;
++k;
}
//下面我要等刚才建立threadNum个线程都完成之后再建立下一批线程。 for(int t=0;t<threadNum;++t)
{
                                  if(dt[t].isAlive())//出错处
dt[t].join();
}
}//问题是跑到出错处就出错了,信息为Exception in thread "main" java.lang.NullPointerException
at Book.Test.createPage(Test.java:102)
at Book.Test.main(Test.java:64)    
请大侠支招,怎么变通实现我这个目的

解决方案 »

  1.   

    因为有点看不懂楼主的循环,所以有一个比较投机的做法
    for(int t=0;t<threadNum;++t)
    {
            if(dt[t]!=null&&dt[t].isAlive())//出错处
    dt[t].join();
    }
      

  2.   

    你代码的错误是空指针错误如果你把urlVec.size()的值设的大于threadNum的值就不会有错反之就会报NullPointerException你试一下
      

  3.   

    主要问题在这一句   k<threadNum&&i<urlVec.size()因为同时满足这两个条件才去执行循环如果i<urlVec.size()小于threadNum的值比urlVec.size大的数组的下标的值将不会被赋予,所以就会是空值
      

  4.   

    vgvg,好像不是这样,这个null的出错是在线程建立之后啊,而且我在for(int k=0;k<threadNum&&i<urlVec.size();)这里已经防止你说的那种情况。
      

  5.   

    按照alexwan的方法,暂时没有问题了现在,我再测试别的数据看看
      

  6.   

    楼主,你的程序有一个问题,虽然跟 NullPointerException 无关,却很严重。你用的是 t.run(),应该用 t.start()。用 t.run() 的话,实际上并没有启动多线程,而是在当前线程里,把所有的事情顺序地做了一遍。
      

  7.   

    > 主要问题在这一句   k<threadNum&&i<urlVec.size()
    > 因为同时满足这两个条件才去执行循环
    > 如果i<urlVec.size()小于threadNum的值
    > 比urlVec.size大的数组的下标的值将不会被赋予,所以就会是空值关于 NullPointerException 的问题,vgvg 说的是对的。比如 urlVec.size() 是 10, threadNum 是 20,那么,你在前一个循环中只创建了 10 个线程对象,而在后一个循环中,却会试图去 join 20 个线程对象。
      

  8.   

    dt[t].join(不能为null);方法用错了!
    建议不连网
    线程模型运行式一下(调试)
      

  9.   

    maquan,对你说的有理,我开始理解错误了vg的说法。所以加上判断dt[t]是否为null后就没有错误了。谢谢各位。