A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘文飞 中级黑马   /  2012-11-15 14:02  /  2046 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘文飞 于 2012-11-15 14:19 编辑
  1. public class ThreadSyncDemo01 {

  2.         /**
  3.          * @param args
  4.          */
  5.         public static void main(String[] args) {
  6.                 // TODO Auto-generated method stub
  7.                 Runnable run = new TicketThread();
  8.                 Thread t1 = new Thread(run);
  9.                 Thread t2 = new Thread(run);
  10.                 t1.start();
  11.                 t2.start();
  12.         }

  13. }
  14. class Ticket{
  15.         private int amount = 100;
  16.         public void sell(){
  17.                 amount--;
  18.         }
  19.         public int getAmount(){
  20.                 return this.amount;
  21.         }
  22. }
  23. class TicketThread implements Runnable{
  24.         private Ticket T;
  25.         public void run(){
  26.                 while(T.getAmount()>0){
  27.                         T.sell();
  28.                         System.out.println("售出一张票! " + T.getAmount());
  29.                 }
  30.                 System.out.println("票已经卖完了!");
  31.         }
  32. }
复制代码
G:\hezi\Code>java ThreadSyncDemo01
Exception in thread "Thread-0" java.lang.NullPointerException
        at TicketThread.run(ThreadSyncDemo01.java:30)
        at java.lang.Thread.run(Unknown Source)
Exception in thread "Thread-1" java.lang.NullPointerException
        at TicketThread.run(ThreadSyncDemo01.java:30)
        at java.lang.Thread.run(Unknown Source)

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

10 个回复

正序浏览
iacky2 发表于 2012-11-15 19:11
额。。这么解释吧,你要给 TicketThread 类的Ticket  的引用传递 对象(用构造方法就可以),否则它为空  ...

private Ticket T(改为t);
//初始化t = new Ticket();
————————————
有创建对象呢,只是忘了初始化了。
后面那个
public  TicketThread(Ticket T)
      {
          this.T  = T;//传入Ticket对象
貌似多余了吧
回复 使用道具 举报
葛旭东 发表于 2012-11-15 16:47
你要创建对象,用对象来调用方法啊。你也可以在TicketThread类中创建Ticket对象,没有对象怎么调用非静态 ...

private Ticket T(改为t);

————————————
有创建对象呢,只是忘了初始化了。
后面那个
public  TicketThread(Ticket T)
      {
          this.T  = T;//传入Ticket对象
貌似多余了吧
回复 使用道具 举报
王玮 中级黑马 2012-11-15 19:11:35
9#
刘文飞 发表于 2012-11-15 16:23
需要将共享的对象传递给构造方法吗?
不明白

额。。这么解释吧,你要给 TicketThread 类的Ticket  的引用传递 对象(用构造方法就可以),否则它为空 当调用T.getAmount的时候就会有 空指针异常。
回复 使用道具 举报
刘文飞 发表于 2012-11-15 16:24
public  TicketThread(Ticket T)
      {
          this.T  = T;//传入Ticket对象

你要创建对象,用对象来调用方法啊。你也可以在TicketThread类中创建Ticket对象,没有对象怎么调用非静态方法???
回复 使用道具 举报
葛旭东 发表于 2012-11-15 14:38
class TicketThread implements Runnable{
      private Ticket T;
      public  TicketThread(Ticket T) ...

public  TicketThread(Ticket T)
      {
          this.T  = T;//传入Ticket对象
        }
为什么要这样做呢,新建TicketThread时用的依然是默认的啊?
回复 使用道具 举报
iacky2 发表于 2012-11-15 14:35
你没new Ticket(),并且没把new Ticket() 传给TicketThread,并且未给TicketThread中的Ticket t 初始化 ...

需要将共享的对象传递给构造方法吗?
不明白
回复 使用道具 举报
class TicketThread implements Runnable{
      private Ticket T;
      public  TicketThread(Ticket T)
      {
          this.T  = T;//传入Ticket对象
        }
      public void run(){
       while(T.getAmount()>0){
                  T.sell();
     System.out.println("售出一张票! " + T.getAmount());
        }
      System.out.println("票已经卖完了!");
       }
}
回复 使用道具 举报
你没new Ticket(),并且没把new Ticket() 传给TicketThread,并且未给TicketThread中的Ticket t 初始化。

我对应你的代码 添改了一下,把这些在你的代码中改一下就能运行了:

Ticket t=new Ticket();
Runnable run = new TicketThread(t);

class TicketThread implements Runnable {
        private Ticket t;
        TicketThread(Ticket t){
               
                this.t=t;
        }

}
回复 使用道具 举报
颜峰 发表于 2012-11-15 14:16
Ticket T;没有初始化,写个构造函数把Ticket T传进去

正解:hug::hug::hug::hug::hug:
回复 使用道具 举报
Ticket T;没有初始化,写个构造函数把Ticket T传进去
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马