首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

关于java的线程有关问题(有可用答案就结贴)

2012-01-03 
关于java的线程问题(有可用答案就结贴)初学者,不要见笑,不废话,三个类:public class Operate//调用线程的

关于java的线程问题(有可用答案就结贴)
初学者,不要见笑,不废话,三个类:
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);
  }
很奇怪为什么会进这个方法,网上查了下资料很少,说什么无法捕获的错误,云里雾里,忘高手指点

[解决办法]
我还不如人呢,没人笑。
[解决办法]
int[] sorts;
你这东西初始化了吗
[解决办法]

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


[解决办法]
PrintBean pb = new PrintBean(machine);
pb.operateArray(createMachine());
[解决办法]
PrintBean pb = new PrintBean();
问题不在于你初始化 pb 
而是sorts的初始化,
它是在 PrintBean 的另一个构造方法中初始化的。
[解决办法]

你刚开始初始化了一个PrintBean 对象,但是你在调用线程run()方法的时候,又创建了一个PrintBean对象,此时存在两个PrintBean对象,而你的线程中是用run()方法创建的对象,这个对象并没有初始化你的数组。所以你要在run()方法中初始化数组,在main()方法中不需要在new PrintBean了,我说明白了么?
[解决办法]
MARK!!
[解决办法]
你两次创建的是不同的对象,main函数里面实例化PrintBean 类的时候,初始化了sort数组,可是你在run方法理又实例化了PrintBean 类,而这个调用的是无参构造函数,并没有初始化sort数组,他们是两个不同的实例对象,所以你在运行的时候会报那样的错

探讨

引用:

引用:

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

public class PrintBean //产生数组的类
在这个类的构造方法中初始化了
public PrintBean(int machine){
sorts = new int[machine];
}

publi……

热点排行