2013-08-13 2 views
1

У меня есть метод (в классе), который передается 2 целыми числами и затем возвращает значение в этой «координате» в массиве с зубцами, который настроен как 2D-сетка. Так, например, GetXY(5,6) вернет любое целочисленное значение, находящееся в этой позиции.Если логика операторов и массивы

В методе у меня есть оператор if, который проверяет, что переданные значения не находятся ниже нуля или выше, чем размер массива, и генерирует исключение с throw new, если значения.

Код частично работает, за исключением того, что он определяет, когда строка имеет неправильное значение и ничего не делает, когда столбец имеет неправильное значение.

Вот мой код (grid создается в конструкторе класса):

public int GetXY(int row, int column) 
     { 

      int[] items = grid[column]; 

      if (row < 0 || column < 0 || row >= grid.Length || column >= items.Length) 
      { 
       throw new Exception("The passed coordinates are outside the range of the grid. " + 
        "Passed coordinates: " + row.ToString() + "," + column.ToString() + "."); 
      } 

      return grid[row][column]; 
      } 

Когда я GetXY (10.9) (на 10х10) сетки, Я получаю сообщение об исключении, за исключением случаев, Я получаю GetXY (9, 10) Получаю:

Unhandled Exception: System.IndexOutOfRangeException: Index was outside the boun 
ds of the array. 
    at ProcGen.ProceduralGrid.GetXY(Int32 row, Int32 column) in C:\Users\Lloyd\do 
cuments\visual studio 2010\Projects\ProcGen\ProcGen\ProceduralGrid.cs:line 127 
    at ProcGen.Program.Main(String[] args) in C:\Users\Lloyd\documents\visual stu 
dio 2010\Projects\ProcGen\ProcGen\Program.cs:line 27 

Почему это работает только для строк? Что случилось?

Благодаря

+0

исключение исключений происходит, когда у вас нет такого количества записей. Помните, что индекс массива основан на 0, это может быть так же просто, как сделать -1 для ваших значений для поиска массива. –

+1

Также вы должны бросить более конкретное исключение, например 'ArgumentOutOfRangeException' или' IndexOutOfRangeException' – vittore

ответ

10

Эта линия бросает вне границ, прежде чем попасть к условному

int[] items = grid[column]; 

Просто переместите его вниз после того, как вы убедились, что параметры являются безопасными:

public int GetXY(int row, int column) 
{ 
    if (row < 0 || column < 0 || row >= grid.Length || column >= grid[row].Length) 
    { 
     throw new Exception("The passed coordinates are outside the range of the grid. " + 
       "Passed coordinates: " + row.ToString() + "," + column.ToString() + "."); 
    } 
    return grid[row][column]; 
} 
+0

Будет ли это работать? элементы объявляются перед частью if, чтобы они могли делать items.Length? – user9993

+0

Должно быть '|| column> = grid [row] .Length', так как он неровный. – zimdanen

+0

@zimdanen Да заметил, что, также, исправлено. Спасибо –

Смежные вопросы