2011-02-16 128 views
0

我一直在2.4上工作,並且遇到程序無法正常工作,出現空指針異常,因爲它無法獲取源和目標的帳號。現在我用50個事務運行程序,但是我使用更多的空指針異常出現,如果你能指導我到正確的路徑,那將是非常好的。該代碼發佈如下。BankAccount問題和線程,請幫忙

以下是輸出示例。

Withdrawing 592.5 from account 3 
Balance is: 9339.92 
Balance is: 9339.92 
Withdrawing 496.81 from account 7 
Withdrawing 233.86 from account 2 
Balance is: 9339.92 
Withdrawing 366.35 from account 5 
Depositing 366.35 from account 6 
Transfer occuring from 5 to 6 done. 
Depositing 32.8 from account 6 
Depositing 911.01 from account 8 
Transfer occuring from 1 to 8 
Withdrawing 601.23 from account 1 
Depositing 601.23 from account 8 
Transfer occuring from 1 to 8 done. 
Withdrawing 115.42 from account 8 
Transfer occuring from 8 to 5 
Withdrawing 886.08 from account 8 
Depositing 886.08 from account 5 
Transfer occuring from 8 to 5 done. 
Transfer occuring from 8 to 9 
Withdrawing 820.83 from account 8 
Transfer occuring from 5 to 7 
Withdrawing 50.96 from account 5 
Depositing 50.96 from account 7 
Transfer occuring from 5 to 7 done. 
Balance is: 8738.69 
Exception in thread "Thread-43" Depositing 820.83 from account 9 
Transfer occuring from 8 to 9 done. 
[b]java.lang.NullPointerException 
    at OrderedTeller.transfer(OrderedTeller.java:54) 
    at OrderedTeller.run(OrderedTeller.java:29)[/b] 
Withdrawing 361.35 from account 2 
Depositing 472.04 from account 9 
Balance is: 9452.789999999999 
Transfer occuring from 1 to 2 
Withdrawing 255.33 from account 1 
Depositing 255.33 from account 2 
Transfer occuring from 1 to 2 done. 
Depositing 359.63 from account 2 
Depositing 880.57 from account 6 
Depositing 734.09 from account 7 
Withdrawing 210.11 from account 4 
Depositing 640.98 from account 5 
Withdrawing 172.63 from account 5 

代碼:

public class Bank { 

    private List<BankAccount> bankAccounts = new ArrayList<BankAccount>(); 

    public Bank() { 


    for (int i = 0; i < 10; i++) { 
     bankAccounts.add(new BankAccount(i, 10000.00)); 
    } 

    doTransActions("Transactions.txt"); 

    } 

    public void doTransActions(String fileName) { 
    BufferedReader in = null; 
    try { 
     String strLine = null; 
     in = new BufferedReader(new FileReader(fileName)); 
     int distinationAccount = 0; 
     int sourceAccount = 0; 
     double amount = 0; 

     while ((strLine = in.readLine()) != null) { 

     java.lang.String[] tokens = strLine.split("[%]"); 
     String transaction = tokens[0]; 

     if (transaction.equals("TRANSFER")) { 


      sourceAccount = Integer.parseInt(tokens[1]); 
      distinationAccount = Integer.parseInt(tokens[2]); 
      amount = Double.parseDouble(tokens[3]); 

      BankAccount source = null; 
      BankAccount distination = null; 
      for (BankAccount account : bankAccounts) { 

      if (account.getNumber() == sourceAccount) { 

       source = account; 


      } 
      if (account.getNumber() == distinationAccount) { 

       distination = account; 


      } 
      } 

      new OrderedTeller(source, distination, transaction, amount).start(); 

     } else { 

      sourceAccount = Integer.parseInt(tokens[1]); 
      amount = Double.parseDouble(tokens[2]); 

      BankAccount source = null; 

      for (BankAccount account : bankAccounts) { 

      if (account.getNumber() == sourceAccount) { 

       source = account; 

      } 
      } 

      new OrderedTeller(source, transaction, amount).start(); 

     } 

     } 
    } catch (IOException e) { 

     System.out.println(e.getMessage()); 

    } finally { 
     try { 
     in.close(); 
     } catch (IOException e) { 

     System.out.println(e.getMessage()); 
     } 
    } 

    } 

} 

public class OrderedTeller extends Thread { 

    private BankAccount source = null, dest = null; 
    private String transType = null; 
    private double amount = 0; 

    public OrderedTeller(BankAccount a, BankAccount b, String transType, double amount) 

    { 
    source = a; 
    dest = b; 
    this.amount = amount; 
    this.transType = transType; 
    } 

    public OrderedTeller(BankAccount a, String transType, double amount) 

    { 
    source = a; 
    this.amount = amount; 
    this.transType = transType; 
    } 

    public void run() { 

    if (transType.equals("TRANSFER")) { 

     transfer(amount); 

    } else if (transType.equals("WITHDRAW")) { 

     source.withdraw(amount); 


    } else if (transType.equals("DEPOSIT")) { 

     source.deposit(amount); 

    } else if (transType.equals("BALANCE")) { 

     System.out.println("Balance is: "+source.getBalance()); 

    } else { 

     System.out.println("ERROR: TRANSACTION TYPE NOT RECOGNIZED"); 
    } 
    } 

    public void transfer(double amount) { 

    BankAccount first, second; 

    if (source.getNumber() < dest.getNumber()) { 
     first = source; 
     second = dest; 
    } else { 
     first = dest; 
     second = source; 
    } 
    synchronized (first) { 
     Thread.yield(); 
     synchronized (second) { 
     System.out.println("Transfer occuring from " + source.getNumber() + " to " + dest.getNumber()); 
     source.withdraw(amount); 
     dest.deposit(amount); 
     System.out.println("Transfer occuring from " + source.getNumber() + " to " + dest.getNumber()+ " done."); 
     } 
    } 
    } 
} 

public class BankAccount { 

    private double balance = 0; 
    private int number = 0; 

    public BankAccount(int number, double initialBalance) { 
    this.number = number; 
    balance = initialBalance; 
    } 

    public int getNumber() { 

    return number; 
    } 

    public double getBalance() { 

    return balance; 
    } 

    public synchronized void deposit(double amount) { 

    double prevBalance = balance; 
    System.out.println("Depositing " + amount + " from account " + number); 
    balance = prevBalance + amount; 
    } 

    public synchronized void withdraw(double amount) { 

    double prevBalance = balance; 
    System.out.println("Withdrawing " + amount + " from account " + number); 
    balance = prevBalance - amount; 
    } 

} 

這是文本文件,我從 閱讀交易的每一行與真實文本文件中的交易開始。

TRANSFER%4%3%866.85 
TRANSFER%2%7%861.79 
BALANCE%9%895.41 
DEPOSIT%7%475.82 
WITHDRAW%3%845.92 
WITHDRAW%4%766.69 
BALANCE%10%591.67 
DEPOSIT%8%12.22 
TRANSFER%3%6%57.45 
BALANCE%10%417.84 
TRANSFER%10%8%928.33 
TRANSFER%9%7%94.46 
WITHDRAW%5%874.17 
DEPOSIT%9%538.37 
BALANCE%9%324.88 
TRANSFER%6%7%773.23 
DEPOSIT%3%81.81 
BALANCE%8%564.51 
TRANSFER%6%2%300.17 
TRANSFER%5%6%366.35 
DEPOSIT%10%627.87 
DEPOSIT%8%911.01 
TRANSFER%1%2%535.72 
TRANSFER%1%8%601.23 
TRANSFER%1%6%124.36 
WITHDRAW%8%115.42 
BALANCE%3%942.87 
TRANSFER%8%5%886.08 
DEPOSIT%7%604.41 
WITHDRAW%2%361.35 
WITHDRAW%2%233.86 
WITHDRAW%4%210.11 
DEPOSIT%6%32.8 
DEPOSIT%6%880.57 
WITHDRAW%7%496.81 
WITHDRAW%5%172.63 
BALANCE%1%70.4 
DEPOSIT%7%734.09 
BALANCE%1%274.6 
DEPOSIT%5%640.98 
WITHDRAW%3%592.5 
DEPOSIT%9%472.04 
BALANCE%1%647.71 
TRANSFER%3%10%537.52 
BALANCE%1%461.09 
BALANCE%3%172.58 
TRANSFER%8%9%820.83 
TRANSFER%1%2%255.33 
TRANSFER%5%7%50.96 
DEPOSIT%2%359.63 
+0

我已經(至少部分)格式化了代碼(和文本),但是我必須說我有點懷疑它會做很多好事。在大多數人非常努力地幫助診斷你的問題之前,你真的需要將問題縮小到更合理大小的代碼塊。 – 2011-02-16 07:02:33

回答

3

看起來您的文件中的帳號是基於1的,而您生成的帳號是基於零的。因此,當它試圖在文件中執行涉及帳戶#10的操作時,它將無法設置源或目標,並且會得到空指針異常。

0

如果我不得不猜測,我會說你在OrderedTeller上調用了run(),這個OrderedTeller是用錯誤的構造函數構造的,因爲只有其中一個初始化源和目標。爲了簡化事情。

如果不是這樣,請嘗試將某些東西粘貼到構造函數中,該構造函數在使用空來源和目標進行初始化時引發異常。通過這種方式,您可以找到問題實際來源的位置:錯誤地初始化對象。