Exception in thread “Thread-98“ java.lang.NullPointerException解决方法

线程类里面报空指针错误,一开始我以为是传的参数有问题,打了断点,debug却进不去,然后输出了一下service和传参,终于发现了原因。

================================>null
================================>CommonRegionTownsVo(channelNbr=null, staffCode=null, xCtgProvinceId=null, xCtgLanId=null, commonRegionId=xxxxxxxxx, )
Exception in thread "Thread-98" java.lang.NullPointerException
	at org.springblade.xxxxxx.xxxxxx.xxxx.run(CommonRegionTownsThread.java:92)
	at java.lang.Thread.run(Thread.java:748)

线程类里的service是空的,参数是有的。

我首先想到的是new这个service,虽然这个serv是有了,不为空,但是service的实现类里面的mapper却又变成空的。于是意识到了这样做下去势必会影响到其他方法,于是换了其他的办法。

框架用的是springboot,于是我便将这个线程类放到容器里面管理,思考了一下应该是service是容器管理的,这个线程类里面service 是new出来的,两者冲突就报了空指针这个错。

于是便将这个线程类加注解@Component ,由spring容器管理
然后注入这个service`

@Autowired
	private IDzChannelService dzChannelService;

这个空指针异常便解决了
总结原因就是spring容器管理与new这个类冲突了,解决办法就是放到spring容器管理

另外补充一下往线程里传参数的方法,参考网上的方法,因为一开始这个线程类是通过构造方法往里传的,然后交由spring容器管理就换了传参的方法
向线程中传递数据的三种方法:

一、通过构造函数传递参数

public class MyThread1 extends Thread
{
    private String name;
    public MyThread1(String name)
    {
        this.name = name;
    }
    public void run()
    {
        System.out.println("hello " + name);
    }
    public static void main(String[] args)
    {
        Thread thread = new MyThread1("world");
        thread.start();        
    }
}

二、通过变量和方法传递数据

public class MyThread2 implements Runnable
{
    private String name;
    public void setName(String name)
    {
        this.name = name;
    }
    public void run()
    {
        System.out.println("hello " + name);
    }
    public static void main(String[] args)
    {
        MyThread2 myThread = new MyThread2();
        myThread.setName("world");
        Thread thread = new Thread(myThread);
        thread.start();
    }
}

三、通过回调函数传递数据

class Data
{
    public int value = 0;
}
class Work
{
    public void process(Data data, Integer numbers)
    {
        for (int n : numbers)
        {
            data.value += n;
        }
    }
}
public class MyThread3 extends Thread
{
    private Work work;
 
    public MyThread3(Work work)
    {
        this.work = work;
    }
    public void run()
    {
        java.util.Random random = new java.util.Random();
        Data data = new Data();
        int n1 = random.nextInt(1000);
        int n2 = random.nextInt(2000);
        int n3 = random.nextInt(3000);
        work.process(data, n1, n2, n3);   // 使用回调函数
        System.out.println(String.valueOf(n1) + "+" + String.valueOf(n2) + "+"
                + String.valueOf(n3) + "=" + data.value);
    }
    public static void main(String[] args)
    {
        Thread thread = new MyThread3(new Work());
        thread.start();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值