线程无缘无故地给出NullPointerException

时间:2012-08-20 22:48:49

标签: java multithreading nullpointerexception

所以我正在做这个尴尬的例子来理解Java中的线程是如何工作的。 实际上它很简单,但是,当我试图触发超过3个线程时,我似乎无法理解为什么这会给我一个NullPointerException异常。

你能解决一下吗? Eclipse的调试器没有帮助: - (

提前致谢!!

public class Main {

    public static void main(String[] args) {

        Main boot = new Main();
    }

    public Main()
    {
        CoolThread myThread = new CoolThread(1, 2);
        Thread t_myThread = new Thread(myThread);
        t_myThread.start();

        myThread.defineMain(this);
    }


    public void teste(String tests){
        CoolThread myThread = new CoolThread(1, 2);
        Thread t_myThread = new Thread(myThread);
        t_myThread.start();
    }

}

public class CoolThread extends Thread {

int firstNum;
int secondNum;
Main myMain;

/**
 * Constructor
 * @param firstNum
 * @param secondNum
 */
public CoolThread(int firstNum, int secondNum)
{
    this.firstNum = firstNum;
    this.secondNum = secondNum;
}

public void defineMain(Main myMain)
{
    this.myMain = myMain;
}
/**
 * Fires the thread.
 */
public void run()
{
    try{
        int number = 0;
        for(;;)
        {

            int soma = (firstNum+secondNum);
            System.out.println("ID: " +Thread.currentThread().getId());
            firstNum++;
            secondNum++;
            number++;
            Thread.sleep(100);
            if((number % 10) == 0)
            {
                myMain.teste("The sum is: " + soma);
            }
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }

}

}

顺便说一句,这是我得到的输出:

ID: 9
ID: 9
ID: 9
ID: 9
ID: 9
ID: 9
ID: 9
ID: 9
ID: 9
ID: 9
ID: 9
ID: 12
ID: 9
ID: 12
ID: 12
ID: 9
ID: 12
ID: 9
ID: 12
ID: 9
ID: 12
ID: 9
ID: 12
ID: 9
ID: 12
ID: 9
ID: 12
ID: 9
ID: 9
ID: 12
ID: 9
ID: 14
java.lang.NullPointerException
    at my.own.package.CoolThread.run(CoolThread.java:44)
    at java.lang.Thread.run(Thread.java:722)

它继续创建和杀死线程......

2 个答案:

答案 0 :(得分:8)

您要么在启动主题后调用myThread.defineMain(...) (在Main中),要么根本不调用defineMain(...)(在teste(...)中)。你需要在线程运行之前定义main,否则当你到达第44行时myMain null可能是myMain.teste("The sum is: " + soma); ,我认为是:

CoolThread myThread = new CoolThread(1, 2);
// this must be done _before_ the thread starts below
myThread.defineMain(this);
Thread t_myThread = new Thread(myThread);
t_myThread.start();

这是thread race condition的定义。您的起始代码应为:

null

从不认为JDK是错误的。这将扼杀您用于查找问题的任何调试和批判性思维。了解如何use the debugger in eclipse。然后,您可以在第44行放置一个断点并调查变量。

不幸的是,在这种情况下,你有一个线程程序,调试正在改变程序的时间,很可能隐藏了bug。您可能试图在第44行打印出各种对象,以查看哪一个是CoolThread


另外,正如@kurtzbot指出的那样,如果Thread延伸new CoolThread(),那么您可以说coolThread.start()然后CoolThread。您应该做的是Runnable实施Thread而不是扩展CoolThread myThread = new CoolThread(1, 2); // this must be done _before_ the thread starts below myThread.defineMain(this); Thread t_myThread = new Thread(myThread); t_myThread.start(); ... public class CoolThread implements Runnable { public void run() { ... } } 。这是更好的模式:

{{1}}

答案 1 :(得分:0)

我怀疑从teste方法启动新线程时myMain为null。您需要在teste方法中调用defineMain,就像在Main类的构造函数中一样。