在 C# 中 if 语句的 while 循环结束时,空白的 try 和 catch IndexOutOfBoundsException 是否有效?

问题描述 投票:0回答:2

我正在完成一个未完成的C# WinForms项目,这是一个未指定游戏的保存游戏编辑器。我注意到角色肖像和图标的 ID 的有效范围是 1 到 905,但是没有代码来验证角色 ID 是否在该范围内,所以我选择修复它。我对此有一个正在进行的解决方案,其代码(许多函数名称部分经过编辑)位于本文末尾,并且想知道它是否有效。 Visual Studio 表示不存在格式错误,但我知道仅此还不够。我无法编译进行测试,因为我还没有达到代码可编译的阶段,缺少大量 WinForms 数据。如果我设置的特定例外不合适,那么什么例外最适合?如果不应该以这种方式使用 while 循环,我应该使用什么方法而不需要从头开始重写整个代码块?这是我到目前为止的相关代码:

void getImage(int slot)
        {
            short ID = 0;

            if (slot == 1)
            {
                try
                {
                    ID = convertStringtoID(comboBoxSlot1ID.Text);
                }
                catch (System.FormatException)
                {
                    ID = 0;
                }

                while (ID > 0 && ID < 906)
                {
                    if (ID < 10)
                    {
                        pictureBoxSlot1Portrait.Image = (Image)Properties.Resources.ResourceManager.GetObject("00" + ID);
                        pictureBoxSlot1Icon.Image = (Image)Properties.Resources.ResourceManager.GetObject("dot00" + ID);
                    }

                    else if (ID > 9 && ID < 100)
                    {
                        pictureBoxSlot1Portrait.Image = (Image)Properties.Resources.ResourceManager.GetObject("0" + ID);
                        pictureBoxSlot1Icon.Image = (Image)Properties.Resources.ResourceManager.GetObject("dot0" + ID);
                    }

                    else if (ID > 99 && ID < 906)
                    {
                        pictureBoxSlot1Portrait.Image = (Image)Properties.Resources.ResourceManager.GetObject("" + ID);
                        pictureBoxSlot1Icon.Image = (Image)Properties.Resources.ResourceManager.GetObject("dot" + ID);
                    }

                    else
                    {
                        try { }
                        catch (System.IndexOutOfRangeException)
                        {
                            ID = 0;
                        }
                    }
                }

我还无法尝试或测试任何东西;这只是一个关于 C# 代码的有效使用的问题。我还看到了 1 个与我在发布此内容之前在“可能相关的问题”部分中提出的问题类似但不相同的问题,尽管它确实部分表明我正在做的事情可能没问题。如果

IndexOutOfBoundsException
大于 905,我希望代码抛出
ID
,如果不是,则读取正确的图像文件。

c# if-statement while-loop try-catch indexoutofboundsexception
2个回答
0
投票

记下这个结构:

try
{
    ID = convertStringtoID(comboBoxSlot1ID.Text);
}
catch (System.FormatException)
{
    ID = 0;
}

注意

try
块如何包装可能会失败的操作。与此结构对比:

try
{
}
catch (System.IndexOutOfRangeException)
{
    ID = 0;
}

try

内的哪些操作可能会失败,为什么?

任何可能失败的操作都会在

try
块内进行。如果该操作是一个完整的循环,那么整个循环都会去那里。


但是,这里所拥有的首先并不是异常的有效使用。不要依赖异常条件,您可以直接在代码中检查。

值得注意的是循环逻辑:

while (ID > 0 && ID < 906)

如果

ID
不在这个范围内,那么循环将不会再次迭代。在此范围之外,如果您想在不在此范围内时将
ID
设置为
0
,这是一个简单的
if
条件:

if (ID <= 0 || ID >= 906)
{
    ID = 0;
}

或者,也许在您的特定代码范围内,如果该

else
块的目标是将
ID
设置为
0
那么您可以...将
ID
设置为
0
:

else
{
    ID = 0;
}

(请注意,即使是前面所示的结构上有效的 try/catch 也可以用逻辑替换。看一下

TryParse
方法。)


0
投票
try { }
catch (System.IndexOutOfRangeException)
{
      ID = 0;
}

这没有任何作用,应该删除。

"00" + ID

您只需执行

ID.ToString("000")
即可获取该数字的零前缀三位数字符串。

I am expecting the code to throw IndexOutOfBoundsException if ID is greater than 905

来自 ResourceManager.GetObject

返回对象

针对调用者当前文化设置本地化的资源值。如果存在适当的资源集但找不到名称,则该方法返回 null。

那么你为什么期待

IndexOutOfBoundsException

while (ID > 0 && ID < 906)

您没有在循环内递增 ID,因此此循环将是无限的。

I noticed that character portraits and icons IDs have a valid range of 1 to 905

对这些值进行硬编码并不是一个好主意,因为这样的事情经常会发生变化。您可能应该列出资源文件中的所有图标,并从某种列表中显示有效选项。或者只是尝试检索用户输入的任何内容,如果不存在则通知用户失败。

© www.soinside.com 2019 - 2024. All rights reserved.