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

昆卡卡 2011-09-27 10:14:12
初学者,不要见笑,不废话,三个类:
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);
}
很奇怪为什么会进这个方法,网上查了下资料很少,说什么无法捕获的错误,云里雾里,忘高手指点
...全文
294 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
guoying_ 2011-09-27
  • 打赏
  • 举报
回复
是的,这样就可以了!对面向对象的理解可能需要一段时间,我也是学过一段java,然后做了一段开发,重新在学习一变java才对其中的一些东西有较深入的理解的。楼主加油,搞技术的要脚踏实地,慢慢来!
昆卡卡 2011-09-27
  • 打赏
  • 举报
回复
谢谢各位,是我对对象不理解,这样改就可以了
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();
}

}
}
java_primer 2011-09-27
  • 打赏
  • 举报
回复
你两次创建的是不同的对象,main函数里面实例化PrintBean 类的时候,初始化了sort数组,可是你在run方法理又实例化了PrintBean 类,而这个调用的是无参构造函数,并没有初始化sort数组,他们是两个不同的实例对象,所以你在运行的时候会报那样的错
[Quote=引用 15 楼 guoying_ 的回复:]

引用 9 楼 yyy269954107 的回复:

引用 7 楼 gukuitian 的回复:

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

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

publi……
[/Quote]
昆卡卡 2011-09-27
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 softroad 的回复:]

PrintBean pb = new PrintBean(machine);
pb.operateArray(createMachine());
[/Quote]
恩,我试试
昆卡卡 2011-09-27
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 gukuitian 的回复:]

PrintBean pb = new PrintBean();
问题不在于你初始化 pb
而是sorts的初始化,
它是在 PrintBean 的另一个构造方法中初始化的。
[/Quote]
我再试下哈
昆卡卡 2011-09-27
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 guoying_ 的回复:]
你刚开始初始化了一个PrintBean 对象,但是你在调用线程run()方法的时候,又创建了一个PrintBean对象,此时存在两个PrintBean对象,而你的线程中是用run()方法创建的对象,这个对象并没有初始化你的数组。所以你要在run()方法中初始化数组,在main()方法中不需要在new PrintBean了,我说明白了么?
[/Quote]
哦,知道了,我再试试哈,谢谢
兔子侠客 2011-09-27
  • 打赏
  • 举报
回复
MARK!!
guoying_ 2011-09-27
  • 打赏
  • 举报
回复

你刚开始初始化了一个PrintBean 对象,但是你在调用线程run()方法的时候,又创建了一个PrintBean对象,此时存在两个PrintBean对象,而你的线程中是用run()方法创建的对象,这个对象并没有初始化你的数组。所以你要在run()方法中初始化数组,在main()方法中不需要在new PrintBean了,我说明白了么?
gukuitian 2011-09-27
  • 打赏
  • 举报
回复
PrintBean pb = new PrintBean();
问题不在于你初始化 pb
而是sorts的初始化,
它是在 PrintBean 的另一个构造方法中初始化的。
guoying_ 2011-09-27
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 yyy269954107 的回复:]

引用 12 楼 guoying_ 的回复:

public void run(){
lock.lock();
PrintBean pb = new PrintBean();
pb.operateArray(createMachine());
lock.unlock();
}

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

}
你的这个方法中构造了一个PrintBean对象,调用的构造函数并没有给你的 int[] sor……
[/Quote]
昆卡卡 2011-09-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 guoying_ 的回复:]

public void run(){
lock.lock();
PrintBean pb = new PrintBean();
pb.operateArray(createMachine());
lock.unlock();
}

}
你的这个方法中构造了一个PrintBean对象,调用的构造函数并没有给你的 int[] sorts;数组初始化,那……
[/Quote]
我一开始就在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();
}
guoying_ 2011-09-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yyy269954107 的回复:]

引用 7 楼 gukuitian 的回复:

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

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

public class Operate //调用线……
[/Quote]
嗯,调用这个构造函数是对其初始话了
softroad 2011-09-27
  • 打赏
  • 举报
回复
PrintBean pb = new PrintBean(machine);
pb.operateArray(createMachine());
昆卡卡 2011-09-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 gukuitian 的回复:]

Java code
public void run(){
lock.lock();
PrintBean pb = new PrintBean(); //构造方法用错了,sorts根本就没初始化
pb.operateArray(createMachine());
lock.unlock();
}
[/Quote]
我在主函数初始化了呀,这里创建对象PrintBean pb = new PrintBean(); 就是为了调用pb的方法,
难道这里也要初始化吗?
guoying_ 2011-09-27
  • 打赏
  • 举报
回复
public void run(){
lock.lock();
PrintBean pb = new PrintBean();
pb.operateArray(createMachine());
lock.unlock();
}

}
你的这个方法中构造了一个PrintBean对象,调用的构造函数并没有给你的 int[] sorts;数组初始化,那么你调用 pb.operateArray(createMachine())的时候,数组没有初始化就对其进行sorts[x-1]++,当然会报nullpoint错误了啊,我说的楼主明白了么?
amayhappy1986 2011-09-27
  • 打赏
  • 举报
回复
有点难度哦!
昆卡卡 2011-09-27
  • 打赏
  • 举报
回复
求机器猫的答案啊
昆卡卡 2011-09-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gukuitian 的回复:]

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

public class Operate //调用线程的主函数
PrintBean pb = new PrintBean(machine);
这个算是初始化了吧
gukuitian 2011-09-27
  • 打赏
  • 举报
回复
public void run(){
lock.lock();
PrintBean pb = new PrintBean(); //构造方法用错了,sorts根本就没初始化
pb.operateArray(createMachine());
lock.unlock();
}
gukuitian 2011-09-27
  • 打赏
  • 举报
回复
int[] sorts;
你这东西初始化了吗
加载更多回复(8)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧