Gate类
package com.ccit;public class Gate {
private int count=0;
private String name;
private String address;
public void pass(String name,String address){
count++;
this.name=name;
this.address=address;
} public void check(String name,String address){
count++;
char[] c1=name.toCharArray();
char[] c2=name.toCharArray();
if(c1[0]==c2[0]){
System.out.print("回家了");
}else{
System.out.print("你走错家门了");
}

}}EnterThread类
package com.ccit;public class EnterThread extends Thread {
    private Gate gate;
    private String myname;
    private String myaddress;
    public EnterThread(){
    
    }
    
    public EnterThread(String myname,String myaddress){
     this.myname=myname;
     this.myaddress=myaddress;
    }
    public synchronized void run(){
     while(true){
       gate.check(myname, myaddress);
       try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
     }
    }
    
     
    
    
}测试类
package com.ccit;public class Test {
public static void main(String[] args) {

EnterThread e1=new EnterThread("lxb","lxbjia");
EnterThread e2=new EnterThread("syj","syjjia");
e1.start();
e2.start();
}}
结果总是空指针异常  怎么回事啊  谢谢了

解决方案 »

  1.   

    EnterThread 中的成员变量 Gate 不需要实例化一下么?
      

  2.   

    private Gate gate;
    和Gate gate=new Gate();有什么区别啊  
    我是新手,搞不清,谢谢指教
    还有这题本意是不加synchronized 这个关键字 能输出  走错家门的信息 可现在不加都能真确回家,是怎么回事啊?
    谢谢指教了
      

  3.   

    private Gate gate; 这个只是声明了一个指向 Gate 对象的变量,这个变量具体指向哪一个对象并没有说明,没说明的话他就是 null 值。
      

  4.   

    private Gate gate只是生命了gate这个变量,但是不会在内存中分配用剑
      

  5.   

    还有这题本意是不加synchronized 这个关键字 能输出 走错家门的信息 可现在不加都能真确回家,是怎么回事啊?
    这个怎么解释啊
      

  6.   

    上面Gate类中改下
    char[] c1=name.toCharArray();
    char[] c2=address.toCharArray();
    别的错误在哪啊
      

  7.   

    应该是  char[] c1 = name.toCharArray();
    char[] c2 = address.toCharArray();吧
    你那么写的话必然是一样的 - -
      

  8.   

    gate没有初始化啊,可以学着debug啊,这个例子和多线程有好大关系吗?
      

  9.   

    private Gate gate;
    这个你没有具体说明指向那,只是给它声明了一下
      

  10.   


    package thread;public class ProducerAndCustomerDemo {
    public static void main(String[] args) {
    Queue q=new Queue();
    Productor p=new Productor(q);
    Customer c=new Customer(q);
    p.start();
    c.start();
    }
    }
    class Customer extends Thread{
    Queue q;
    public Customer(Queue q) {
    // TODO Auto-generated constructor stub
    this.q=q;
    }
    @Override
    public void run() {
    // TODO Auto-generated method stub
    while (q.value<10) {
    System.out.println("Customer get "+q.get());
    }
    }
    }
    class Productor extends Thread{
    Queue q;
    public Productor(Queue q) {
    // TODO Auto-generated constructor stub
    this.q=q;
    }
    @Override
    public void run() {
    // TODO Auto-generated method stub
    for (int i = 1; i <=10; i++) {
    q.put(i);
    System.out.println("Productor put "+i);
    }
    }
    }
    class Queue{
    int value;
    boolean bFull=false;
    public synchronized void  put(int i){
    if (!bFull) {
    value=i;
    bFull=true;
    //notify();
    notifyAll();
    try {
    wait();
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    public synchronized int get(){
    if (!bFull) {
    try {
    wait();
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    bFull=false;
    notifyAll();
    return value;
    }
    }
      

  11.   

    Gate() 实例化!!!!!!!!!
    private Gate gate;声明了一个对象并没有去实例化,本身就是null。所以报空
      

  12.   

    不加互斥锁的时候相当于有两个人同时在检查自己有没有走错门。char[] c1=name.toCharArray();
    char[] c2=address.toCharArray();A把自己的信息输入进去了,还没有执行if(c1[0]==c2[0]){这个时候B跑过来把name  改成了自己的名字,而地址还是A家的,这不就走错了家门吗??加锁的情况就是 A在做检查的时候B是不可以检查的,这样就不会有问题了
      

  13.   

    char[] c1 = name.toCharArray();
    char[] c2 = address.toCharArray();