«System.IndexOutOfRangeException» произошло в массиве переключателей case

бросил мне «System.IndexOutOfRangeException» в том месте, где его не было год или два назад, когда я впервые сделал это. Я спросил своего нынешнего профессора, но он просто сказал: «Это работает, нет проблем». Мы оба получаем исключение, так что непонятно, почему учитель этого не делает. Вот код:

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" на "i"

и теперь массив не работает. только возвращает случай по умолчанию. снова застрял. я отредактировал свой прогресс.

РЕДАКТИРОВАТЬ

Обнаружили кучу ошибок, когда собрались вместе. Готовая программа выглядит следующим образом.

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();
    }
}
}

Спасибо, что помогли нам начать работу над исправлениями, мы оба ценим это, друг!


person Austin Bigge    schedule 06.04.2015    source источник


Ответы (1)


Точка с запятой в строке for является причиной вашей проблемы:

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

За циклом for должен следовать блок, но в этом случае, поскольку за ним следует точка с запятой, последующий код не является частью цикла, а представляет собой обычный код, который выполняется один раз.

Таким образом, цикл for выполняется с пустым телом, и когда он выполнен, i имеет значение длины массива, которое, конечно, на единицу больше, чем максимальный индекс, который генерирует это исключение.

Чтобы исправить это, создайте блок (фигурные скобки) вокруг группы кода, который вы хотите включить в цикл.

Это также поднимает отдельную проблему - циклы for обычно объявляют индексатор в самом цикле - если бы вы определили i в for, то это было бы вне области действия для следующих строк и было бы легче увидеть ваша ошибка, так как это была бы ошибка компилятора.

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