我正在编写类似流氓的控制台程序,但我有一个问题:
我的代码没有捕获异常。我有void
个for
个循环和arrays
。
阵列超出范围时发生错误。发生这种情况是因为虚空不会检查数组是否为零或超过最大值。
void lightUp(int pos)
{
//first and second
for (int i = 1; i > -2; i--)
{
int lolPos = pos + (i * columns);
for (int j = 0; j < 8; j++)
{
tiles[lolPos + j].isVisible = true;
tiles[lolPos - j].isVisible = true;
}
}
//third
for (int i = 2; i > -3; i -= 4)
{
int lolPos = pos + (i * columns);
for (int j = 0; j < 7; j++)
{
tiles[lolPos + j].isVisible = true;
tiles[lolPos - j].isVisible = true;
}
}
//fourth
for (int i = 3; i > -4; i -= 6)
{
int lolPos = pos + (i * columns);
for (int j = 0; j < 6; j++)
{
tiles[lolPos + j].isVisible = true;
tiles[lolPos - j].isVisible = true;
}
}
//fifth
for (int i = 4; i > -5; i -= 8)
{
int lolPos = pos + (i * columns);
for (int j = 0; j < 5; j++)
{
tiles[lolPos + j].isVisible = true;
tiles[lolPos - j].isVisible = true;
}
}
for (int i = 5; i > -6; i -= 10)
{
int lolPos = pos + (i * columns);
for (int j = 0; j < 3; j++)
{
tiles[lolPos + j].isVisible = true;
tiles[lolPos - j].isVisible = true;
}
}
}
所以我做了一个catch块,以防错误发生,我的程序不会崩溃。
try
{
lightUp(player);
}
catch { }
但是,我仍然有IndexOutOfRange
例外。它们不会被catch
块困住。
那是为什么?
编辑: 感谢所有的答案。以为,问题不在于调试模式选项。 我发现这只会在程序启动时发生。我测试过,如果我只是走到&#34;超出范围&#34; (虚空点亮了玩家附近的瓷砖),捕获块确实有效。但不是在我启动程序的时候。(播放器的位置是随机的,如果它靠近左侧屏幕的一侧,则会在启动时发生异常。)
另一个编辑:我修复了#34;魔法数字&#34;(不低于零,不超过最大值), 无论发生什么事情,这都会有效。
答案 0 :(得分:1)
你想尝试这个:
public void lightUp(int pos)
{
int loopcounter = -2;
int jcount = 8;
int stepcount=1;
int stepcountReflected=0;
try
{
for (int x = 1; x > -6; x--)
{
if (x == 1)
{
stepcountReflected=0.5*stepcount;
}
else
{
stepcountReflected = stepcount;
}
for (int i = stepcount; i > loopcounter; i =- (2 * stepcountReflected))
{
int lolPos = pos + (i * columns);
for (int j = 0; j < jcount; j++)
{
tiles[lolPos + j].isVisible = true;
tiles[lolPos - j].isVisible = true;
}
}
loopcounter = loopcounter - 1;
jcount = jcount - 1;
}
}
catch (Exception ex)
{
// do what yo need to do here
}
}
目前,您正尝试捕获子/函数之外的异常,这就是为什么您没有得到可靠的错误描述。 当你没有提到任何特定的“异常”而不是非常专业的“StackOverflowException”时,你会看到什么和哪里让你头疼。 添加逐行活动的记录日志可能对您有所帮助,但这不是您的问题,而是我会做的。
答案 1 :(得分:0)
检入VS是否在选中的例外情况下没有中断选项(键盘快捷键:ctrl+d, e
):
http://truncatedcodr.wordpress.com/2011/04/04/visual-studiodebugexceptions/
“Common Language Runtime Exceptions”行与此相关。
答案 2 :(得分:-1)
我可以看到除了异常问题之外的两件事:
该方法中的代码太多了。它很难测试,如果失败,很难弄清楚为什么 - 这就是你现在所看到的。
代码看起来像c / p,有一些修正,所以你应该更好地抽象这样做。这将使以后更容易更改,并减少代码。更少的代码几乎总是好的。
您面临的问题是您必须指定要捕获的错误,并执行必要的错误处理。习惯上不捕获所有异常(异常类),因为这将使调试更加困难。这是邪恶的!