这是我的代码的一部分:
DateTime answer;
DateTime today = DateTime.Today;
do {
if (years / planetyeardata[0] > 1)
{
answer = today.AddDays(87.97 * (1 - (days / 87.97 - (days / 87.97))));
mnbd.Text = answer.ToString();
today = answer;
}
else
{
answer = today.AddDays(87.97 * (1 - days / 87.97)); // + (224.7 * (1 - days / 224.7) * 24 * 3600 * 1000));
today = answer;
mnbd.Text = answer.ToString();
}
} while (today <= answer);
如果我没有围绕if语句执行do-while语句,那么可以解决一些代码问题&#34;回答&#34;工作正常。但是,当我得到这个错误的时候。
我基本上想继续执行&#34;回答&#34;直到它的值高于当前日期。
答案 0 :(得分:0)
所以这里对你的代码进行了一些分析。
简而言之 - 您的执行列表永远不会结束循环,除了一种情况外,您还可以达到最小或最大DateTime
值,然后您将获得异常。< / p>
长版本 - 您的执行列表包含2个部分 - 一个在if
中,一个在else
块中。由于条件为years / planetyeardata[0] > 1
,并且循环中的任何内容都不会更改years
或planetyeardata
,因此可以将此条件视为常量。基本上,你的do-while循环将始终转到if
阻止或始终转到else
阻止。
如果它正在输入if
块,则表达式answer = today.AddDays(87.97 * (1 - (days / 87.97 - (days / 87.97))));
将始终为answer = today.AddDays(87.97)
,原因是(days / 87.97 - (days / 87.97))
始终为0.紧接着,您正在设置today = answer
。由于您始终将today
设置为等于answer
,因此您永远不会违反while (today <= answer)
条件。另一方面,您的日期总是会增加87.97天,并且会在某个时间大于DateTime.MaxValue
,这会引发异常。
如果它输入else
块,则表达式为answer = today.AddDays(87.97 * (1 - days / 87.97));
。根据{{1}}值,您有3种可能的结果:
days
- 在这种情况下days < 87.97
将始终大于零,因为您的日期会逐渐增加,直到您到达(1 - days / 87.97)
会引发异常DateTime.MaxValue
- 在这种情况下,days == 87.97
将始终等于零,因为您的日期永远不会改变,永远不会离开do-while块(1 - days / 87.97)
- 在这种情况下,days > 87.97
将始终小于零,因为您的日期将逐渐减少,直到您到达(1 - days / 87.97)
将引发异常由于您在设置DateTime.MinValue
后立即执行,因此您永远不会中断today = answer
条件,并且您的循环将永远不会停止,直到您获得异常。
因此,通常情况下,您的while (today <= answer)
条件始终会得到满足,并且块内的代码将始终超出可用while
值的范围,并带有一个可能的结果(DateTime
位于{{ 1}}阻止)你的日期总是保持不变,永远不会离开do-while块。
答案 1 :(得分:0)
DateTime Structure的最小值为1/1/0001,最大值为12/31/9999
循环中的代码尝试添加使today
超出此范围的天数。
您可以检查溢出并相应地处理异常:
DateTime answer;
DateTime today = DateTime.Today;
do
{
if (years / planetyeardata[0] > 1)
{
var daysToAdd = (1 - (days / 87.97 - (days / 87.97)));
if (daysToAdd > 0 && DateTime.MaxValue.Subtract(today).TotalDays > daysToAdd)
throw new Exception(string.Format("Can't add {0} days to {1}", daysToAdd, today));
if (daysToAdd < 0 && today.Subtract(DateTime.MinValue).TotalDays > daysToAdd)
throw new Exception(string.Format("Can't add {0} days to {1}", daysToAdd, today));
answer = today.AddDays(87.97 *daysToAdd );
mnbd.Text = answer.ToString();
today = answer;
}
else
{
var daysToAdd = (1 - (days / 87.97 - (days / 87.97)));
if (daysToAdd > 0 && DateTime.MaxValue.Subtract(today).TotalDays > daysToAdd)
throw new Exception(string.Format("Can't add {0} days to {1}", daysToAdd, today));
if (daysToAdd < 0 && today.Subtract(DateTime.MinValue).TotalDays> daysToAdd)
throw new Exception(string.Format("Can't add {0} days to {1}", daysToAdd, today));
answer = today.AddDays(87.97 * (1 - days / 87.97)); // + (224.7 * (1 - days / 224.7) * 24 * 3600 * 1000));
today = answer;
mnbd.Text = answer.ToString();
}
} while (today <= answer);