MichaelJackhow 2021-01-26 21:52 采纳率: 100%
浏览 122
已结题

java对线程数组用for(Thread t : threads)遍历并创建实例后无法通过下标访问

public class MyThreadB extends Thread{
    private int i;
    public MyThreadB(){}
    public MyThreadB(String name){
        super();
        this.setName(name);
    }
    @Override
    synchronized public void run(){
        i--;
        System.out.println(currentThread().getName() + " : " + i);
    }

    public static void main(String[] args) {

        //多线程共享实例变量demo
        MyThread thread = new MyThread(5);
        Thread[] threads = new Thread[5];
        char a = 97;
        // 让threads数组中的五个thread共享传入的myThread中的实例变量
        for(int i = 0; i < 5; i++){
            String s = String.valueOf(a++);
            //调用Thread类的Thread(Runnable target, String name)构造函数
            threads[i] = new Thread(thread, s);

            threads[i].run();

        }
        System.out.println(threads[1].isAlive());
    }
}

完整代码如上,问题出在截图所示的部分:

按照如上的代码,运行到第43行的sout输出语句就回抛出空指针异常,提示threads[1]为空(不光是下标为1的为空,所有都为空)

不管把第43行的sout语句放到39行还是41行、也不管是使用t.start()还是t.run(),sout语句都抛出空指针异常。当然,在39行或41行加上

System.out.println(t.isAlive());

是可以正常运行的。

尝试了一下通过下标遍历,如下图。则第43行正常运行不会出现空指针异常

 

不知道为何会是这种情况——通过for( : )语句遍历Thread对象创建实例会出现通过下标访问则抛出空指针异常的问题

 

希望有大佬帮忙解答

  • 写回答

2条回答 默认 最新

  • 八云黧 2021-01-26 22:45
    关注

    for each循环等价于使用迭代器的普通for循环,其中的t是每次循环创建的内部变量,并把迭代器的next()赋值给该变量,所以无法通过赋值对原来的数组进行改变。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月26日
  • 已采纳回答 10月18日

悬赏问题

  • ¥15 echarts动画效果失效的问题。官网下载的例子。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加