2014-10-02 42 views
0

代碼:錯誤輸出,我想不通爲什麼

ArrayList<Employer> use = new ArrayList<Employer>(); 
    ArrayList<String> Alia = new ArrayList<String>(); 
    int moneyE, moneyF; 
    String Alias = ""; 
    boolean alert, alertF; 
    for(int i = 0; i < Filers.size(); i++) 
    { 
     moneyE=0; 
     use.clear(); 
     Alia.clear(); 
     Alias = ""; 
     alert = false; alertF = false; 
     use.addAll(this.findEmployerRecords(Filers.get(i))); 
     moneyF = Filers.get(i).getIncome(); 

     for(int j = 0; j< use.size(); j++) 
     { 
      moneyE += use.get(j).getEmployeeWages(); 
      if(!(Filers.get(i).getName().equals(use.get(j).getEmployeeName())) 
      && !(Alia.contains(use.get(j).getEmployeeName()))) 
       Alia.add(use.get(j).getEmployeeName()); 
      if(moneyE !=moneyF 
      && !(Filers.get(i).getName().substring(0, Filers.get(i).getName().indexOf(" ")+1).equals(
      use.get(j).getEmployeeName().substring(0, use.get(j).getName().indexOf(" ")+1))))   //problem occurs here 
       alert = true; 
      if (alert = true) 
       alertF = true; 
     } 
     for(int j=1; j<Alia.size();j++) 
      Alias+= (", " + Alia.get(j)); 
     if (moneyE != moneyF) 
      Discrepancies.add(new Discrepancy(alertF, moneyF-moneyE, Filers.get(i).getName(), 
      Filers.get(i).getSSN(), Alias)); 
    } 

我在我的棒結束。我無法弄清楚我在這裏做錯了什麼。這是我用來創建虛擬IRS的一些代碼。如果我在問題點刪除+1,我會得到一個超出限制的異常。我遇到的問題是警報和alertF。如果貨幣E和貨幣F不匹配,並且僱主記錄和歸檔人員之間的姓氏拼寫不同,則警報狀態應該消失。警報以星號顯示。

預計:

*-100, HEATON MARK, 309582302, MCGUIRE MARK 
    *-50, FOX CHARLES, 724113610, BOX CHARLES 
    +105, MOFFITT DONALD, 206516583, MOFFITT DON 
    +100, YOUNG THOMAS, 813068590, YOUNG THOM, YOUNG TOM 
    -20, SOMASUNDAR PRASANTH, 138001926 
    +5, HORSLEY MARIA, 239984300 
    +5, LIANG BO, 743287509 
    +5, LIANG BO, 857410861 

實際:

*105, MOFFITT DONALD, 206516583 
    *-100, HEATON MARK, 309582302, HEATON MARK 
    *100, YOUNG THOMAS, 813068590, YOUNG TOM 
    *-50, FOX CHARLES, 724113610 
    *-20, SOMASUNDAR PRASANTH, 138001926 
    *5, HORSLEY MARIA, 239984300 
    *5, LIANG BO, 743287509 
    *5, LIANG BO, 857410861 
+4

你應該附加一個調試器,並通過您的代碼步,看看你的問題所取代。 – mkobit 2014-10-02 01:33:07

+1

用完整的堆棧跟蹤發佈您的異常。 – 2014-10-02 01:37:19

+0

在最後一個for循環中,您將'j'初始化爲1,那可以嗎? – 2014-10-02 01:42:51

回答

0

通過取出重複調用同一個對象簡化代碼,即你有你的邏輯中多次呼籲要Filers.get(i)。將這些抽象出來以提高代碼的可讀性。

此外,你有很多不說話,想想你的邏輯。

提示:!A & !B = ! (A | B)

下面是一個簡單的,易於閱讀你的代碼的版本。

alert = false; 
alertF = false; 
Filer f = Filers.get(i); 
use.addAll(this.findEmployerRecords(f)); 
moneyF = f.getIncome(); 
String filersName = f.getName(); 

for(int j = 0; j< use.size(); j++) 
{ 
    moneyE += use.get(j).getEmployeeWages(); 
    String emplName = use.get(j).getEmployeeName(); 

    if(!(filersName.equals(emplName) || Alia.contains(emplName))) 
      Alia.add(emplName); 

    if(!(moneyE == moneyF || filersName.substring(0, filersName.indexOf(" ")+1).equals(
     emplName.substring(0, use.get(j).getName().indexOf(" ")+1)))) //problem occurs here 
      alert = true; 

    if (alert = true) 
      alertF = true; 
} 
for(int j=1; j<Alia.size();j++) 
    Alias+= (", " + Alia.get(j)); 
if (moneyE != moneyF) 
    Discrepancies.add(new Discrepancy(alertF, moneyF-moneyE, filersName, f.getSSN(), Alias)); 

爲了幫助你理解什麼錯誤,添加一些打印語句這樣

System.out.println("i=" + i + ", j=" + j + ", fName="+ filersName + ", index= "+ filersName.indexOf(" ") + ", substing= "+ filersName.substring(0, filersName.indexOf(" ")+1)); 
之前,你的邏輯語句

。還要爲您比較的僱主名稱添加一個。


也有這個一個很大的問題,在這裏這條線

if (alert = true) 

總是被設置警報變量設置爲true - 沒有比較,因爲你只有一個=。其實你並不需要在邏輯語句來比較布爾

if (A == true)相當於if(A)

更妙的是你可以有一個布爾值。你的代碼是這樣的

if(/*Condition*/) 
     alert = true; 
if (alert) 
     alertF = true; 

,並可以只用

if(/*Condition*/) 
     alertF = true;