为什么我得到int 9的无限for循环?

时间:2013-05-07 08:43:35

标签: java for-loop

最后描述了背景。

简而言之,为什么下面的foor循环适用于yearInt 0-8但是当yearInt varliable是9时,循环变得无穷无尽?

     int yearInt = 9;//scanned year - for testing        
    int currentYearFourNumbers = Calendar.getInstance().get(Calendar.YEAR); // current year

    currentYearFourNumbers = 2023; // for testing!! 

   int currentYearLastDigit=currentYearFourNumbers%10; //mod operator for getting last digit of current year 
    int resultYear = currentYearFourNumbers;    //init int result which will represent the identified year 
    int checkNumber = currentYearLastDigit; //counter or check number for for loop

       for (int i = yearInt; i != checkNumber; checkNumber--){

           checkNumber = resultYear%10;
            System.out.println (checkNumber);
            System.out.println (i);
           resultYear = resultYear -1; 
           System.out.println (resultYear);
       }

如果我有一个8,它可以看到输出:

检查:3 against8 2022 检查:2 against8 2021 检查:1 against8 2020 检查:0 against8 2019 检查:9 against8 2018 制造日期2018

背景:

我需要创建逻辑来确定哪一年应该基于一位数输入数据库。 数字是来自设备的扫描序列号的一部分,代表制造年份。

数字4现在应该代表2004年,但明年应该代表2014年。 逻辑应该在2020年也有效,所以我需要一个“permament”解决方案。

我因此创建了一个foor循环,它接受扫描的数字并将其与当前年份的最后一位数字进行比较。然后我每年减去(设备不能有未来日期),直到一年的最后一位数与扫描年份相同。

3 个答案:

答案 0 :(得分:3)

让我们来看看:

for (int i = yearInt; i != checkNumber; checkNumber--){
     checkNumber = resultYear%10;
     System.out.println (checkNumber);// In here you are just giving it the initial value again.
     System.out.println (i);
     resultYear = resultYear -1; 
     System.out.println (resultYear);
}

因此,您的循环将在i != checkNumber时执行,并且checkNumber在每次迭代时递减。但如果开始checkNumber < i该怎么办?这就是你的无限循环来自哪里。如果从i > checkNumber开始,checkNumber永远不会是== i

在您的情况下,checkNumber3。你的循环可能应该i--而不是checkNumber--

更简单的解决方案:

public static int getFinalYear(int digit) {
    int year = 2013;
    int finalYear = year;
    int lastYear = year % 10;
    if (digit > lastYear) {
        finalYear += (digit - lastYear) - 10;
    } else {
        finalYear -= lastYear - digit;
    }
    return finalYear;
}

它没有经过全面测试,但请看一下。

System.out.println(getFinalYear(1));// 2011
System.out.println(getFinalYear(2));// 2012
System.out.println(getFinalYear(3));// 2013
System.out.println(getFinalYear(4));// 2004
System.out.println(getFinalYear(5));// 2005
System.out.println(getFinalYear(6));// 2006
System.out.println(getFinalYear(7));// 2007
System.out.println(getFinalYear(8));// 2008
System.out.println(getFinalYear(9));// 2009

答案 1 :(得分:1)

在java中,增量/减量语句(在你的情况下为checkNumber--)总是在条件语句之前进行求值,除了第一次迭代。

在你的情况下,当for循环中的checkNumber为9时,它会在比较之前递减到8

这样的事情应该适合你的情况 -

for (int i = yearInt; i != checkNumber;){
  checkNumber = resultYear%10;
  System.out.println (checkNumber);
  System.out.println (i);
  resultYear = resultYear -1; 
  System.out.println (resultYear);
  if(checkNumber==0){//whenever checknumber is 0, it should be set to 9 
    checkNumber=9;
  }else{
    checkNumber--;
  }
}

以上只是避免infinte循环的一个例子。您可能需要根据业务需求进一步修改代码。

答案 2 :(得分:1)

问题是你没有注意到for循环是如何工作的。

根据Orcale.com

的Java教程
  

每次迭代循环后都会调用increment表达式。

这是您的代码的工作方式, 在每次迭代中,for语句减少checkNumber。我已经调试并且看到当我是9并且checkNumber是9时for应该终止但是对于语句首先减少chechNumber然后处理标准。

我已将代码更改为下面的代码,它解决了无限问题。

// the value of checkNumber should check before decrement! 
for (int i = yearInt; i != checkNumber --; ){

    checkNumber = resultYear%10;
    System.out.println (checkNumber);
    System.out.println (i);
    resultYear = resultYear -1;
    System.out.println (resultYear);
}

我希望它有所帮助:)。