Проверка границ в Java
Я пытаюсь проверить, находится ли местоположение массива вне пределов, какой самый простой способ?
int[] arr;
populate(arr);
if(arr[-1] == null)
//out of bounds!
Что-то вроде этой работы?
Я уверен, что это можно сделать с помощью trycatch или сканера, но для простой небольшой программы, есть ли другой способ?
Ответы
Ответ 1
Абсолютно не используйте для этого try-catch. Просто используйте:
boolean inBounds = (index >= 0) && (index < array.length);
Реализация подхода с try-catch повлечет за собой захват ArrayIndexOutOfBoundsException
, который является неконтролируемым исключением (т.е. подкласс RuntimeException
). Такие исключения никогда не должны (или, по крайней мере, очень редко) быть пойманы и обработаны. Вместо этого их следует предотвратить в первую очередь.
Другими словами, исключенные исключения являются исключениями, из-за которых ваша программа не должна восстанавливаться. Теперь здесь и там могут быть исключения (не каламбур). Например, стало обычной практикой проверять, является ли строка парой в качестве целого числа, вызвав на ней Integer.parseInt()
и поймав потенциал NumberFormatException
(который не отмечен). Это считается ОК, но всегда думайте дважды, прежде чем делать что-то подобное.
Ответ 2
Нет, это вызовет исключение.
Вместо этого do
if (x < 0 || x >= arr.length) {
//x is out of bounds!
}
Ответ 3
Лучше проверить, находится ли указатель в диапазоне вручную.
if(index >=0 && index < array.length){
// in range
}
Исключения, которые не отмечены, то есть, которые не требуют блока try-catch, не должны быть пойманы. ArrayIndexOutOfBoundsException
является одним из них.
Все непроверенные исключения относятся к классу RuntimeException
.
Из этого класса приходит IndexOutOfBoundsException
Это дополнительно специализируется на StringIndexOutOfBounds
и ArrayIndexOutOfBounds
RuntimeException - это суперкласс из тех исключений, которые могут быть брошенному во время нормальной работы виртуальной машины Java.
RuntimeException и его подклассы - это исключенные исключения. Непроверенные исключения не должны быть объявлены в методе или конструктор бросает предложение, если они могут быть брошены путем выполнения метод или конструктор и распространяются вне метода или граница конструктора.