【问题标题】:C# Error(s) in a Try Block involving a loop, array, a subscript, and an IndexOutOfRangeException涉及循环、数组、下标和 IndexOutOfRangeException 的 Try 块中的 C# 错误
【发布时间】:2011-05-09 10:15:00
【问题描述】:

我在下面包含了我的源代码草稿。对于我做错了什么,我将不胜感激。我不确定我的语法是否正确......另外,我确实在 Cramster 上找到了一个例子;但我不确定该示例是否按照说明实现了“下标”(如果我错了,请指出)。我还认为“for”循环是相当重复的,因为它似乎建立了与下标应该建立的相同的东西......这段代码是为了响应以下分配:

"编写一个程序,在其中声明一个由五个整数组成的数组并在其中存储五个值 数组。编写一个 try 块,在其中放置一个循环,尝试访问每个 数组的元素,将下标从 0 递增到 10。创建一个 catch 块 捕获最终的 IndexOutOfRangeException;在块内,显示“现在 你已经走得太远了。”屏幕上。将文件另存为 GoTooFar.cs。”

Microsoft® Visual C#® 2008,面向对象编程简介,3e,Joyce Farrell

我的源代码有错误:

using System;

namespace Further

{
   public class GoTooFar
   {
      public static void Main()
      {
         private static int[] fiveIntArray = {1, 2, 3, 4, 5};
         //private static int CUTOFF = 11;    

         int subscript;
         int rate;


         try
         {
            //bool further;
            //public static int DetermineArray(int further)
            for(int x = 0; x < 10; x++)
            if(further < 11)
               throw new IndexOutofRangeException("Now you've gone too far.");
               subscript = 0;
            else
               subscript = 10;
            rate = fiveIntArray[subscript];
            return rate;
         }

         catch(IndexOutOfRangeException e)
         {
            throw;
            Console.WriteLine(e.StackTrace);
            //Console.WriteLine("Now you've gone too far.");
            //return e;
         }
      }
   }   
}                                       

//我在 Cramster.com 上找到的示例:

using System;
namespace Console2
{   
   class Class1
   {
      static void Main(string[] args)
      {
         int[] numbers = new int[5] {1, 2, 3, 4, 5};

         try
         {
            for(int i=0;i<10;i++)
            if(i>5)
               throw new IndexOutOfRangeException("Now you’ve gone too far.");
         }

         catch(IndexOutOfRangeException e)
         {
            throw;
         }

      }//end ma...
   }
}

【问题讨论】:

    标签: arrays loops exception-handling try-catch


    【解决方案1】:

    您不应该抛出异常,只需捕获运行时抛出的异常即可。还有其他几个问题:

    1. 您在方法中声明了一个字段。只需删除private static
    2. 只有 if/else 在 for 循环中,但您显然也打算访问。我更喜欢总是使用花括号,但这是主观的。
    3. 您显然打算返回每个迭代,这是没有意义的。

    可以这么简单:

    public static void Main()
    {
        int[] fiveIntArray = {1, 2, 3, 4, 5};
        try
        {
            for(int x = 0; x < 10; x++)
            {
                int rate = fiveIntArray[x];
            }
        }
        catch(IndexOutOfRangeException e)
        {
            Console.WriteLine("Now you've gone too far.");
        }       
    }
    

    注意,我们实际上并不使用rate。它就在那里,所以它将是一个有效的声明。

    【讨论】:

    • 非常感谢您的帮助。我非常感谢您花时间指出我的代码中的可怕缺陷(而不是仅仅向我展示应该如何完成)。因为你花时间做这件事,我从你的评论中学到了很多。我不得不说这种建设性的批评对我学习如何编程比仅仅看到一个实际有效的特定源代码更有帮助,因为它向我展示了我所犯的主要错误。也就是说,我确实比 cramster 上的源代码更喜欢你的源代码。少即是多... :-)
    猜你喜欢
    • 2017-09-04
    • 2017-01-24
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    相关资源
    最近更新 更多