输出不正确,我无法弄清楚原因

时间:2014-10-02 01:28:48

标签: java indexoutofboundsexception

代码:

    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,我会得到一个超出范围的异常。我遇到的问题是警报和警报.F。如果moneyE和moneyF不匹配并且雇主记录和申报者之间的姓氏拼写不同,则警报状态应该消失。警报以星号显示。

预期:

  *-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

1 个答案:

答案 0 :(得分: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;