我对线程还很陌生,只是想掌握一些基础知识。因此,我尝试了以下代码来依次打印奇数和偶数。
但是我得到一个空指针。
公共类P {
public static void main(String[] args) throws InterruptedException {
Print print = new Print(false);
Even e =new Even();
Odd o = new Odd();
e.start();
o.start();
}
}
class甚至扩展线程 { 打印打印;
public void run()
{
try {
print.printeven();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Odd扩展线程 { 打印打印;
public void run()
{
try {
print.printodd();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
类打印{
public boolean flag=false;
Print(boolean flag){
this.flag=flag;
}
synchronized void printodd() throws InterruptedException
{
for(int i=1;i<10;i=i+2)
if(!flag)
{
System.out.println(i);
notifyAll();
flag=true;
}
else
{
wait();
}
}
synchronized void printeven() throws InterruptedException
{
for(int i=2;i<=10;i=i+2)
if(flag)
{
System.out.println(i);
notifyAll();
flag=false;
}
else
{
wait();
}
}
}
如果有人可以在这里详细解释我在做什么错,并给出了基本的调试方法。
答案 0 :(得分:0)
您尚未在ODD和EVEN类中实例化Print实例。
对偶数和奇数构造函数都执行此操作。
public Odd(Print print)
{
this.print = print;
}
实例化时要这样做。
Print print = new Print(false);
Even e =new Even(print);
Odd o = new Odd(print);
答案 1 :(得分:0)
看到你无所事事
Print print = new Print(false); // this statement
在main()方法中。
将“打印”对象传递给Odd和Even类的Constructor。
您将获得Null指针,因为您没有初始化打印对象奇数和偶数类。