Java 为什么int 9会有一个无限for循环?

Java 为什么int 9会有一个无限for循环?,java,for-loop,Java,For Loop,最后介绍了本文的研究背景 简言之,为什么下面的foor循环适用于yearInt 0-8,但当yearInt varreable是9时,循环就变得无止境了 int yearInt = 9;//scanned year - for testing int currentYearFourNumbers = Calendar.getInstance().get(Calendar.YEAR); // current year currentYearFourNum

最后介绍了本文的研究背景

简言之,为什么下面的foor循环适用于yearInt 0-8,但当yearInt varreable是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 反对8 2022 支票:2 反对8 2021 支票:1 反对8 2020 支票:0 反对8 2019 支票:9 反对8 2018 制造日期2018

背景:

我需要创建逻辑,以确定哪一年应该输入到一个基于一个数字的数据库中。 该数字是设备扫描序列号的一部分,表示生产年份

数字4现在应该代表2004年,但明年应该代表2014年。 这种逻辑在2020年也会起作用,所以我需要一个“永久”解决方案

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

让我们看看这里:

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>checkNumber
checkNumber
将永远不会
==i

在您的情况下,
checkNumber
3
。您的循环应该有
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
让我们看看这里:

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>checkNumber
checkNumber
将永远不会
==i

在您的情况下,
checkNumber
3
。您的循环应该有
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

在java中,除了第一次迭代之外,increment/decreament语句(在您的例子中是
checkNumber--
)总是在condition语句之前求值

在您的情况下,当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循环的示例。您可能需要根据业务需求进一步修改代码。

在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循环的示例。您可能需要根据业务需求进一步修改代码。

问题在于您没有注意到for循环是如何工作的

根据

增量表达式在循环的每次迭代后调用

这就是你的代码的工作原理, 在每次for迭代中,for语句都会减少checkNumber。我已经调试并看到当我是9,checkNumber是9时,for应该终止,但是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);
}

我希望它能有所帮助:)

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

根据

增量表达式在循环的每次迭代后调用

这就是你的代码的工作原理, 在每次for迭代中,for语句都会减少checkNumber。我已经调试并看到当我是9,checkNumber是9时,for应该终止,但是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);
}

我希望它能有所帮助:)

谢谢您的意见!如果checknumber(即,在您的示例中,当前年份的最后一个数字=3)小于yearInt(在您的示例中,数字=8),则将8与2(从2012年开始)1(从2011年开始)0(从2010年开始)9(从2009年开始)和8(从2008年开始)进行检查,然后得到我想要的2008年。我确实得到了2008年,但我没有得到2009年。试试看,这很奇怪!!在你的例子中,如果我的数字=2,我将得到2014年而不是2012年。谢谢你的输入!如果checknumber(即,在您的示例中,当前年份的最后一个数字=3)小于yearInt(在您的示例中,数字=8),则将8与2(从2012年开始)1(从2011年开始)0(从2010年开始)9(从2009年开始)和8(从2008年开始)进行检查,然后得到我想要的2008年。我确实得到了2008年,但我没有得到2009年。试试看,这很奇怪!!在你的例子中,如果我的数字=2,我将得到2014年而不是2012年。好的,谢谢,我只是有点困惑,因为它与8而不是9一起工作。查看我的更新问题。您的代码在9中不起作用,因为当checkNumber为
0
且您执行
checkNumber--
时,您的checkNumber将变为
-1
。因此,当checkNumber为
0
u时,您需要手动将其设置为
9
,而不是执行
checkNumber--
。好的,谢谢,我只是有点困惑,因为它使用的是8而不是9。查看我的更新问题。您的代码在9中不起作用,因为当checkNumber为
0
且您执行
checkNumber--
时,您的checkNumber将变为
-1
。因此,当checkNumber为
0
u时,需要手动将其设置为
9
,而不是执行
checkNumber--
。这给了我一个8表示9,7表示8,但没有无限循环,所以我喜欢这样。它是