Java 为什么int 9会有一个无限for循环?
最后介绍了本文的研究背景 简言之,为什么下面的foor循环适用于yearInt 0-8,但当yearInt varreable是9时,循环就变得无止境了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
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,但没有无限循环,所以我喜欢这样。它是