初学者,不要见笑,不废话,三个类:
public class Operate             //调用线程的主函数
{
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        int bean = input.nextInt();
        int machine = input.nextInt();
        PrintBean pb = new PrintBean(machine);
        Lock lock = new ReentrantLock();
        for(int i=0;i<bean;i++){
            new CreateArray(machine, lock).start();
        }
        try
        {
            Thread.sleep(1000);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        pb.printBean();
    }
}
public class CreateArray extends Thread    //线程类
{
    
    private int machine;
    
    private Lock lock;
    
    public CreateArray(){
        
    }
    
    public CreateArray(int machine,Lock lock)
    {
        this.machine = machine;
        this.lock=lock;
    }
    
    public int createNumber(){
        return (int)(Math.random()*2);
    }
    
    public int createMachine(){
        int right=0;
        for(int i=0;i<machine;i++){
            int x = createNumber();
            if(x==1){
                right++;
            }
        }
        return right;
    }
    
    public void run(){
       lock.lock();
       PrintBean pb = new PrintBean();
       pb.operateArray(createMachine());
       lock.unlock();
    }
    
}public class PrintBean     //产生数组的类
{
    int[] sorts;
    
    public PrintBean(){
        
    }
    
    public PrintBean(int machine){
        sorts = new int[machine];
    }
    
    public void operateArray(int x){    
            sorts[x-1]++;      //跟了下到这里报nullpoint错
            }
    
    public void printBean(){
        System.out.println(Arrays.toString(sorts));
    }
}先还奇怪为什么会报nullpoint错,后来debug发现到这里进了thread.class的方法
private void dispatchUncaughtException(Throwable e) {
        getUncaughtExceptionHandler().uncaughtException(this, e);
    }
很奇怪为什么会进这个方法,网上查了下资料很少,说什么无法捕获的错误,云里雾里,忘高手指点

解决方案 »

  1.   

    int[] sorts;
    你这东西初始化了吗
      

  2.   

    public void run(){
      lock.lock();
      PrintBean pb = new PrintBean(); //构造方法用错了,sorts根本就没初始化
      pb.operateArray(createMachine());
      lock.unlock();
      }
      

  3.   

    public class PrintBean //产生数组的类
    在这个类的构造方法中初始化了
    public PrintBean(int machine){
       sorts = new int[machine];
       }
     ,
    public class Operate //调用线程的主函数
    PrintBean pb = new PrintBean(machine);
     这个算是初始化了吧
      

  4.   

      public void run(){
      lock.lock();
      PrintBean pb = new PrintBean();
      pb.operateArray(createMachine());
      lock.unlock();
      }
       
    }
    你的这个方法中构造了一个PrintBean对象,调用的构造函数并没有给你的  int[] sorts;数组初始化,那么你调用 pb.operateArray(createMachine())的时候,数组没有初始化就对其进行sorts[x-1]++,当然会报nullpoint错误了啊,我说的楼主明白了么?
      

  5.   

    我在主函数初始化了呀,这里创建对象PrintBean pb = new PrintBean(); 就是为了调用pb的方法,
    难道这里也要初始化吗?
      

  6.   

      PrintBean pb = new PrintBean(machine);
      pb.operateArray(createMachine());
      

  7.   

    我一开始就在main函数里面初始化了啊public class Operate //调用线程的主函数
    {
       public static void main(String[] args)
       {
       Scanner input = new Scanner(System.in);
       int bean = input.nextInt();
       int machine = input.nextInt();
       PrintBean pb = new PrintBean(machine);
     ,
    难道这里还需要初始化吗?
    public void run(){
      lock.lock();
      PrintBean pb = new PrintBean();
      pb.operateArray(createMachine());
      lock.unlock();
      }
      

  8.   

    PrintBean pb = new PrintBean();
    问题不在于你初始化  pb 
    而是sorts的初始化,
    它是在 PrintBean 的另一个构造方法中初始化的。
      

  9.   


    你刚开始初始化了一个PrintBean 对象,但是你在调用线程run()方法的时候,又创建了一个PrintBean对象,此时存在两个PrintBean对象,而你的线程中是用run()方法创建的对象,这个对象并没有初始化你的数组。所以你要在run()方法中初始化数组,在main()方法中不需要在new PrintBean了,我说明白了么?
      

  10.   

    你两次创建的是不同的对象,main函数里面实例化PrintBean 类的时候,初始化了sort数组,可是你在run方法理又实例化了PrintBean 类,而这个调用的是无参构造函数,并没有初始化sort数组,他们是两个不同的实例对象,所以你在运行的时候会报那样的错
      

  11.   

    谢谢各位,是我对对象不理解,这样改就可以了
    public class Operate
    {
        public static void main(String[] args)
        {
            Scanner input = new Scanner(System.in);
            int bean = input.nextInt();
            int machine = input.nextInt();
            Lock lock = new ReentrantLock();
            PrintBean pb = new PrintBean(machine);
            for(int i=0;i<bean;i++){
                new CreateArray(machine, lock,pb).start();
            }
            
        }
    }
      

  12.   

    是的,这样就可以了!对面向对象的理解可能需要一段时间,我也是学过一段java,然后做了一段开发,重新在学习一变java才对其中的一些东西有较深入的理解的。楼主加油,搞技术的要脚踏实地,慢慢来!