2013-09-05 4 views
-1

У меня есть несколько методов:обработка ArrayIndexOutOfBoundsException и инкапсуляция

Это один:

public Page getPage(int index) 
    {  
     try 
     { 
      return pageList.get(index-1); 
     } 

     catch (ArrayIndexOutOfBoundsException e) 
     { 
      return null; 
     } 
    } 

, которая затем вызывается в этом один:

public Page getNextPage(Page page) 
    { 
     return getPage(getPageIndex(page)+1); 
    } 

, который, еще раз, называется в другом метод:

. 
. 
. 
Page previousPage = chapter.getPreviousPage(page); 

Page nextPage = chapter.getNextPage(page); 

if (previousPage == null) 
{ 
    if (nextPage != null) 
    { 
     nextPage.dummy.setVisible(true); 
    } 
} 
. 
. 
. 

Я знаю, что управление ArrayIndexoutOfBoundsException таким образом, как правило, плохо, но я использую его как средство «beforeStart» или «afterEnd», так как я убедился, что только индекс, который может быть передан в качестве аргумента, находится либо в границах массивов, либо выше на один любая сторона. Всякий раз, когда я вызываю первый метод, я выполняю нуль-проверку, и я знаю, на каком конце («beforeStart» или «afterEnd») ожидать исключения. Так что все круто, это неплохой дизайн. Я делаю это, потому что гораздо меньше кода и усилий, чтобы сделать это таким образом, чем проверять индекс каждый раз перед вызовом первого метода.

Однако это не мешает второму или третьему методу выбросить это же исключение.

Есть ли способ каким-либо образом инкапсулировать код, чтобы исключение обрабатывалось в рамках первого метода и что любой другой метод, который его вызывает, даже не знает, что произошли какие-либо исключения?

Вот что происходит, когда происходит исключение:

Image

+0

Как бы то ни было, только первый метод, который вы указали, должен увидеть исключение. – Cruncher

+0

Я добавил картинку. Я не понимаю, почему это происходит. Если я попытаюсь поймать одно и то же исключение в третьем методе, исключение поймано, но это не решает проблему ... – Karlovsky120

+0

Я также попытался напечатать строку текста в разделе catch. Он напечатал линию вместе с трассировкой стека. – Karlovsky120

ответ

2

Исключение в вашем трассировки стека является IndexOutOfBoundsException, что это то, что брошено от вызова. Исключением, которое вы пытаетесь поймать, является ArrayIndexOutOfBoundsException, а исключение IndexOutOfBoundsEx вылетает прямо мимо него в верхние методы.

ArrayIndexOutOfBoundsException является IndexOutOfBoundsException, но IndexOutOfBoundsException не является ArrayIndexOutOfBoundsException.

1

Вы получаете IndexOutOfBoundsException, что не совпадает с ArrayIndexOutOfBoundsException. Добавьте блок catch для него, и ваш код должен работать.

Сказав, что, полагаясь на исключения, чтобы проверить, слишком ли большой или слишком маленький ваш индекс, очень плохая практика по множеству причин, так как я уверен, что вы можете быстро найти поиск в Google. Просто придерживайтесь проверки сверху доступа к списку с помощью if(index >= 0 && index < list.size()).

На стороне примечания: рассмотрите вопрос о создании getPageIndex() с нулевой индексацией, чтобы оно соответствовало pageList; и используйте что-то вроде getDisplayedIndex(), чтобы вернуть getPageIndex()+1. В противном случае соглашение об именах будет крайне запутанным для людей, смотрящих на ваш код (кто, как я, скорее всего, будет использоваться для работы с нулевыми индексами).

+0

Поскольку программирование - это мое хобби, мне никогда не удается привыкнуть к нуль-индексированным коллекциям. Много раз в моей программе мне приходилось обращаться к первому элементу коллекции, и мой код намного читабельнее (для меня, по крайней мере), если первый элемент имеет индекс 1. Кроме того, маловероятно, что кто-то еще будет глядя на этот код ... – Karlovsky120

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