2015-04-06 53 views
0

在我第一次做这件事的时候,在一年或两年没有的地方抛出'System.IndexOutOfRangeException'。我问了我目前的教练,但他只是说“它在那里工作没有问题”我们都得到了例外,所以idk为什么老师不是。下面是代码:'System.IndexOutOfRangeException'发生在一个case switch array中

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
/* Author: Austin Bigge 
* This program will ask for a ten digit alphanumeric 
* number and return the numeric number. 
*/ 
namespace alphanumeric 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     // Switch for alphanumeric entry 
     string numberString; //alphanumberic entry 
     char currentLetter; 
     string invalue; 
     double pnumber; //returned single numeric phone number 
     int i; //i = the current character space 

     //User prompt 
     Console.WriteLine("This program will ask for an alphanumberic phone "); 
     Console.WriteLine("number and change it into a numeric phone number."); 
     Console.WriteLine("! Alphanumeric characters only !"); 
     Console.WriteLine("! No Spaces, Dashes, or Symbols !"); 
     Console.Write("What is the 10 digit phone number? "); 
     invalue = Console.ReadLine(); 
     numberString = invalue; 

     char[] array = numberString.ToCharArray(); 
     for (i = 0; i < array.Length; i++) //for loop 
     // gets the current letter at position "i" 
     currentLetter = array[i]; 
     switch (i) //case switch for possible entries 
     { 
      case '1': 
       pnumber = 1; Console.WriteLine(pnumber); break; 
      case '2': 
      case 'a': 
      case 'A': 
      case 'b': 
      case 'B': 
      case 'c': 
      case 'C': 
       pnumber = 2; Console.WriteLine(pnumber); break; 
      case '3': 
      case 'd': 
      case 'D': 
      case 'e': 
      case 'E': 
      case 'f': 
      case 'F': 
       pnumber = 3; Console.WriteLine(pnumber); break; 
      case '4': 
      case 'g': 
      case 'G': 
      case 'h': 
      case 'H': 
      case 'i': 
      case 'I': 
       pnumber = 4; Console.WriteLine(pnumber); break; 
      case '5': 
      case 'j': 
      case 'J': 
      case 'k': 
      case 'K': 
      case 'l': 
      case 'L': 
       pnumber = 5; Console.WriteLine(pnumber); break; 
      case '6': 
      case 'm': 
      case 'M': 
      case 'n': 
      case 'N': 
      case 'o': 
      case 'O': 
       pnumber = 6; Console.WriteLine(pnumber); break; 
      case '7': 
      case 'p': 
      case 'P': 
      case 'q': 
      case 'Q': 
      case 'r': 
      case 'R': 
      case 's': 
      case 'S': 
       pnumber = 7; Console.WriteLine(pnumber); break; 
      case '8': 
      case 't': 
      case 'T': 
      case 'u': 
      case 'U': 
      case 'v': 
      case 'V': 
       pnumber = 8; Console.WriteLine(pnumber); break; 
      case '9': 
      case 'w': 
      case 'W': 
      case 'x': 
      case 'X': 
      case 'y': 
      case 'Y': 
      case 'z': 
      case 'Z': 
       pnumber = 9; Console.WriteLine(pnumber); break; 
      case '0': 
       pnumber = 0; Console.WriteLine(pnumber); break; 
      case ' ': Console.WriteLine("Bad Value, do not use spaces"); break; 
      default: Console.WriteLine("Bad Value, use only numbers or letters."); break; 


     } 

    } 
} 

}

任何帮助表示赞赏,他一直问我的帮助,我一直告诉他,他知道一点都不亚于我。 p.s.调试指出,这一例外线36

编辑:

烨你说得对,现在我在第37行“currentLetter”一个未赋值的变量,我已初始化它我想,当我试图初始化它在它告诉我它已经初始化的错误...我一定删除了我的工作程序。我发现这个文件有几个空的迭代。不过,我真的很感谢这个帮助,我的朋友也是如此。

我想我固定它,我改为“currentLetter”与“我”

现在数组是行不通的。只返回默认情况。再次卡住。我编辑了我的进度。

编辑

当我们把头放在一起时发现了一堆错误。完成的程序如下。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     // Switch for alphanumeric entry 
     string numberString; //alphanumberic entry 
     char currentLetter; 
     string invalue; 
     double pnumber; //returned single numeric phone number 
     int i; //i = the current character space 

     //User prompt 
     Console.WriteLine("This program will ask for an alphanumberic phone "); 
     Console.WriteLine("number and change it into a numeric phone number."); 
     Console.WriteLine("! Alphanumeric characters only !"); 
     Console.WriteLine("! No Spaces, Dashes, or Symbols !"); 
     Console.Write("What is the 10 digit phone number? "); 
     invalue = Console.ReadLine(); 
     numberString = invalue; 

     char[] array = numberString.ToCharArray(); 
     for (i = 0; i < 10; i++) 
     { 
      //for loop 
      //numberString = invalue.ToString().ToCharArray()[i]); 
      // gets the current letter at position "i" 
      currentLetter = array[i]; 
      switch (currentLetter) //case switch for possible entries 
      { 
       case '0': 
        pnumber = 0; Console.Write(pnumber); break; 

       case '1': 
        pnumber = 1; Console.Write(pnumber); break; 
       case '2': 
       case 'a': 
       case 'A': 
       case 'b': 
       case 'B': 
       case 'c': 
       case 'C': 
        pnumber = 2; Console.Write(pnumber); break; 
       case '3': 
       case 'd': 
       case 'D': 
       case 'e': 
       case 'E': 
       case 'f': 
       case 'F': 
        pnumber = 3; Console.Write(pnumber); break; 
       case '4': 
       case 'g': 
       case 'G': 
       case 'h': 
       case 'H': 
       case 'i': 
       case 'I': 
        pnumber = 4; Console.Write(pnumber); break; 
       case '5': 
       case 'j': 
       case 'J': 
       case 'k': 
       case 'K': 
       case 'l': 
       case 'L': 
        pnumber = 5; Console.Write(pnumber); break; 

       case '6': 
       case 'm': 
       case 'M': 
       case 'n': 
       case 'N': 
       case 'o': 
       case 'O': 
        pnumber = 6; Console.Write(pnumber); break; 

       case '7': 
       case 'p': 
       case 'P': 
       case 'q': 
       case 'Q': 
       case 'r': 
       case 'R': 
       case 's': 
       case 'S': 
        pnumber = 7; Console.Write(pnumber); break; 

       case '8': 
       case 't': 
       case 'T': 
       case 'u': 
       case 'U': 
       case 'v': 
       case 'V': 
        pnumber = 8; Console.Write(pnumber); break; 

       case '9': 
       case 'w': 
       case 'W': 
       case 'x': 
       case 'X': 
       case 'y': 
       case 'Y': 
       case 'z': 
       case 'Z': 
        pnumber = 9; Console.Write(pnumber); break; 

       case ' ': 
        Console.WriteLine(); 
        Console.WriteLine("Bad Value, do not use spaces"); 
        Console.Write("What is the 10 digit phone number? "); 
        invalue = Console.ReadLine(); 
        numberString = invalue; 
        array = numberString.ToCharArray(); 
        i = 0; 

        break; 
       default: 
        Console.WriteLine(); 
        Console.WriteLine("Bad Value, use only numbers or letters."); 
        Console.Write("What is the 10 digit phone number? "); 
        invalue = Console.ReadLine(); 
        numberString = invalue; 
        array = numberString.ToCharArray(); 
        i = 0; 
        break; 

      } 

     } 
     Console.WriteLine(); 
     Console.WriteLine("Press any key to close this window"); 
     Console.ReadLine(); 
    } 
} 
} 

感谢您让我们开始修复,我们都很感激它,朋友!

回答

2

for行分号是什么导致你的问题:

for (i = 0; i < array.Length; i++) ; //for loop 

for循环应该跟着块,但在这种情况下,因为它后跟一个分号,在下面的代码不是循环的一部分,而只是执行一次的常规代码。

因此,for循环执行一个空的主体,当它完成时,i有一个数组长度的值,这当然是一个高于最大索引,它会抛出该异常。

要解决此问题,请在要包含在循环中的代码组周围创建一个块(花括号)。

这也带来了另外一个问题 - for环路通常会宣布在循环本身的索引 - 如果你将在for定义i,那就已经超出范围以下行,将有更容易看到你的错误,因为它会是一个编译器错误。

for (int i = 0; i < array.Length; i++) 
{ 
    // Your code here 
} 
// i is no longer in scope