import java.io.*;
import java.util.*;
public class Bank {
public static void main(String args[]){
Money m1 = new Money(1000);
GetMoney card = new GetMoney("card");
GetMoney page = new GetMoney("page");
card.start();
page.start();
}
}
class Money {
int money;
Money(int money){
this.money = money;
}
public int getMoney(){
return money;
}
}
class GetMoney extends Thread{
Money m1;
public GetMoney(String string) {
setName(string);
}
public void run(){
f();
}
public synchronized void f(){
int c;
if(Thread.currentThread().getName().equals("card")){
c=m1.getMoney();
c=c-800;
if(c>=0){
System.out.println("已成功取出800元,还剩:"+c);
}else{
System.out.println("对不起余额不足取款失败,账户余额:"+c);
}
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else if (Thread.currentThread().getName().equals("page")){
c=m1.getMoney();
c=c-800;
if(c>=0){
System.out.println("已成功取出800元,还剩:"+c);
}else{
System.out.println("对不起余额不足取款失败,账户余额:"+c);
}
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}这是一个一卡一折银行取款的简单代码 不知道哪里错了?运行时出错了
Exception in thread "card" java.lang.NullPointerException
at GetMoney.f(Bank.java:32)
at GetMoney.run(Bank.java:27)
Exception in thread "page" java.lang.NullPointerException
at GetMoney.f(Bank.java:46)
at GetMoney.run(Bank.java:27)

解决方案 »

  1.   


    import java.io.*;
    import java.util.*;public class Bank {
    public static void main(String args[]) {
    Money m1 = new Money(1000);
    GetMoney card = new GetMoney("card",m1);
    GetMoney page = new GetMoney("page",m1);
    card.start();
    page.start();
    }
    }class Money {
    int money; Money(int money) {
    this.money = money;
    } public int getMoney() {
    return money;
    }
    public void setMoney(int money) {
    this.money = money;
    }
    }class GetMoney extends Thread {
    Money m1; public GetMoney(String string,Money m1) {
    this.m1 = m1;
    setName(string);
    } public void run() {
    f();
    } public synchronized void f() {
    int c;
    if (Thread.currentThread().getName().equals("card")) {
    c = m1.getMoney();
    c = c - 800;
    if (c >= 0) {
    m1.setMoney(c);
    System.out.println("已成功取出800元,还剩:" + c);
    } else {
    System.out.println("对不起余额不足取款失败,账户余额:" + c);
    }
    try {
    Thread.sleep(10000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    } else if (Thread.currentThread().getName().equals("page")) {
    c = m1.getMoney();
    c = c - 800;
    if (c >= 0) {
    m1.setMoney(c);
    System.out.println("已成功取出800元,还剩:" + c);
    } else {
    System.out.println("对不起余额不足取款失败,账户余额:" + c);
    }
    try {
    Thread.sleep(10000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    }
      

  2.   

    有的时候也可以不初始化的(貌似碰到过,没多大影响),当最好还是先初始化为null保险些
      

  3.   


    “初始化为null”与“不初始化”是一样的!
    简单来说,只有小写开头的类型可以不初始化,比如int, long, boolean, double, float等,因为它们有初始值。其余的大写字母开头的,都必须先被new出来,才可以用!初学者请记牢!
      

  4.   

    Exception in thread "card" java.lang.NullPointerException
    at GetMoney.f(Bank.java:32)
    at GetMoney.run(Bank.java:27)空指针错误,一般是调用了null对象的方法导致的.按这个线索去找很容易就能发现是因为m1在调用方法时仍然为null,必须在前面赋一个初值.
      

  5.   

    改成这样 class GetMoney extends Thread {
         Money m1 = new Money(100);    m1没有实例化。