Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要Java生产者消费者问题的帮助,NullPointerException_Java_Multithreading_Nullpointerexception - Fatal编程技术网

需要Java生产者消费者问题的帮助,NullPointerException

需要Java生产者消费者问题的帮助,NullPointerException,java,multithreading,nullpointerexception,Java,Multithreading,Nullpointerexception,这是我的代码: package test; import java.util.logging.Level; import java.util.logging.Logger; class Data{ int ar[]=new int[50]; int ptr; Data() { for(int i=0;i<50;i++) ar[i]=0; ptr=0; } public int p

这是我的代码:

package test;

import java.util.logging.Level;
import java.util.logging.Logger;

class Data{
    int ar[]=new int[50];
    int ptr;

    Data()
    {
        for(int i=0;i<50;i++)
            ar[i]=0;
        ptr=0;
    }

    public int produce()
    {
        if(this.ptr<50)
        {
            this.ar[this.ptr]=1;
            this.ptr++;
            return this.ptr;
        }
        else return -1;
    }

    public int consume()
    {
        if(this.ptr>0)
        {
            this.ar[this.ptr]=0;
            this.ptr--;
            return this.ptr;
        }
        else
            return -1;

    }
}
class Prod implements Runnable{

    private Main m;

    Prod(Main mm)
    {
        m=mm;
    }

    public void run()
    {

            int r = m.d.produce();
            if (r != -1) {
                System.out.println("Produced, total elements: " + r);
            } else
        {
                try {
                wait();
            }
                catch (InterruptedException ex) {
            Logger.getLogger(Prod.class.getName()).log(Level.SEVERE, null, ex);
        }
        }

    }
}

class Cons implements Runnable{

    private Main m;

    Cons(Main mm)
    {
        m=mm;
    }
    public void run()
    {
        int r=m.d.consume();
        if(r!=-1)
            System.out.println("Consumed, total elements: " + r);
         else
        {
                try {
                wait();
            }
                catch (InterruptedException ex) {
            Logger.getLogger(Prod.class.getName()).log(Level.SEVERE, null, ex);
        }

        }
        notify();
    }

}
public class Main{
    Data d;
    public static void main(String s[]) throws InterruptedException{
        Main m = new Main();
        Prod p = new Prod(m);
        Cons c = new Cons(m);
        new Thread(p).start();
        new Thread(c).start();

    }
}
封装测试;
导入java.util.logging.Level;
导入java.util.logging.Logger;
类数据{
int ar[]=新int[50];
int-ptr;
数据()
{

对于(int i=0;i主类中的数据d从未初始化,因此调用m.d.consume()会抛出一个NPE。

在主类中,d已声明但未初始化

替换:

Data d;
与:


我想看一下以下几行:

public void run()
{
    int r=m.d.consume();
我看不出m.d在哪里得到过新数据的实例()

我会在Main中添加一个构造函数,创建一个数据实例并将其分配给d

public class Main{
    Data d;
    public static void main(String s[]) throws InterruptedException{
        Main m = new Main();
        Prod p = new Prod(m);
        Cons c = new Cons(m);
        new Thread(p).start();
        new Thread(c).start();

    }
==已添加==

public Main(){
    d = new Data();
}  
==已添加==

}

同步在哪里?如果使用线程,还应确保“关键部分”在上面的代码中,这将涉及数据的消费和产生方法。

Main.java中哪一行是84,你能给JVM认为是test.Cons.run(Main.java:84)的那一行贴上标签吗?当我把代码放在TextPad中时,第84行显示为“try{”据我所知,它不能抛出NPE。int r=m.d.product();int r=m.d.consume();正在产生错误。凯利,你能建议一个解决方案吗?谢谢凯利,明白了。还有一些逻辑错误。不过会解决的。
}