2014-10-02 66 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;