Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> отловить ошибку переполнения массива 
:(
    Опции темы
icepro
Дата 5.10.2009, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 20.11.2006

Репутация: нет
Всего: нет



есть код, в нем проверка на выход за пределы массива, как перевести этот код на эксепшены?
Код

    public float getElement(int index){
        if((index > getLength()-1) || (index < 0)){
            System.out.println("Index out of vector!");
            return;
        }
        return this.vector[index];
    }

PM MAIL   Вверх
m1ha
Дата 5.10.2009, 04:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 14.5.2007

Репутация: 1
Всего: 1



не до конца понимаю, что значит "перевести код на эксепшены"

можно оставить так, ArrayIndexOutOfBoundsException будет выкидываться сам если будет неправильный индекс
Код

public float getElement(int index){
   return this.vector[index];
}



ну или кидать exception самому, если так хочется
Код

    public float getElement(int index){
        if((index > getLength()-1) || (index < 0)){
            throw new ArrayIndexOutOfBoundsException();
        }
        return this.vector[index];
    }


или если ты хотел избежать именно if'a, то можно сделать вот так, но вобше делать проверки через эксепшены не самый хороший выбор
Код

public float getElement(int index){
    try {
       return this.vector[index];
    }
    catch(ArrayIndexOutOfBoundsException e){
        System.out.println("Index out of vector!");
        return 0;
    }
}


Это сообщение отредактировал(а) m1ha - 5.10.2009, 04:10
PM MAIL   Вверх
Sibit
Дата 6.10.2009, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.10.2009
Где: NSK

Репутация: нет
Всего: 1



А так не пойдет?

Код

    public float getElement(int index) throws ArrayIndexOutOfBoundsException{
              return this.vector[index];
    }


PM MAIL   Вверх
duk
Дата 6.10.2009, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Some Object
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 19.7.2007

Репутация: 4
Всего: 4



Sibit, какой смысл так делать? Это исключение не нужно обрабатывать. Вообще обрабатывать ошибки логики считается дурным тоном, потому как они, теоретически должны xD отсутствовать в программе.
Это объявление (throws ArrayIndexOutOfBoundsException) никак не повлияет на роботу пользователя с методом.
PM MAIL   Вверх
LSD
Дата 6.10.2009, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(duk @  6.10.2009,  19:56 Найти цитируемый пост)
Вообще обрабатывать ошибки логики считается дурным тоном, потому как они, теоретически должны xD отсутствовать в программе.

Жесть какая smile 
И как же скажем ArrayList должен обрабатывать такую ошибку логики, как выход за границы?



Цитата(duk @  6.10.2009,  19:56 Найти цитируемый пост)
Это объявление (throws ArrayIndexOutOfBoundsException) никак не повлияет на роботу пользователя с методом. 

Хорошим тоном считается декларировать все выбрасываемые эксепшены, даже если они рантайм. Потому как IDE и прочие анализаторы кода могут использовать эту информацию.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
duk
Дата 6.10.2009, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Some Object
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 19.7.2007

Репутация: 4
Всего: 4



LSD, Вы хотите сказать что при любом обращении к массиву, Вы объявляете метод в котором это происходит как таким, который генерирует исключения выхода за границы?

Добавлено @ 20:41
В данном случае, даже и если выход произойдет, исключение сгенерируется автоматически.

Код

  public class MyClass {
    public static void main(String[] args)  throws ArrayIndexOutOfBoundsException{
       int[] arr= new int[5];
       arr[5] = 1;
    }


Для чего это делать?

Добавлено @ 20:50
Цитата(LSD @  6.10.2009,  20:22 Найти цитируемый пост)
И как же скажем ArrayList должен обрабатывать такую ошибку логики, как выход за границы?


Я лично не заметил в исходном коде ArrayList перехвата исключений выхода за границы (правда в родительском были).


Это сообщение отредактировал(а) duk - 6.10.2009, 21:20
PM MAIL   Вверх
duk
Дата 6.10.2009, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Some Object
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 19.7.2007

Репутация: 4
Всего: 4



Код

private void RangeCheck(int index) {
    if (index >= size)
        throw new IndexOutOfBoundsException(
        "Index: "+index+", Size: "+size);
}


Код из класса ArrayList, вызывается в методе: 
Код

    public E get(int index) {
    RangeCheck(index);

    return (E) elementData[index];
    }


Но почему-то не объявлен генерирующими ни тот, ни другой.

PM MAIL   Вверх
revenforv
Дата 6.10.2009, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 6.8.2009
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Две цитаты с Programmers' guide по Exceptions (java.sun.com):

Цитата

The next question might be: "If it's so good to document a method's API, including the exceptions it can throw, why not specify runtime exceptions too?" Runtime exceptions represent problems that are the result of a programming problem, and as such, the API client code cannot reasonably be expected to recover from them or to handle them in any way. Such problems include arithmetic exceptions, such as dividing by zero; pointer exceptions, such as trying to access an object through a null reference; and indexing exceptions, such as attempting to access an array element through an index that is too large or too small. 


Которая говорит нам, что RuntimeException свидетельствуют о том, что программист, использующий наследуемый код, не достаточно хорошо знаком с API и совершает ошибки программирования. Не предполагается что после этих ошибок может быть восстановлена работа приложения, т.к. это не разумно. Насколько помню, в спецификации языка сказано о том же. "Throw RuntimeException then you do not expect one's application to recover. <...> Use that to mark up the programmatic errors while using API."

Цитата

Runtime exceptions can occur anywhere in a program, and in a typical one they can be very numerous. Having to add runtime exceptions in every method declaration would reduce a program's clarity.


LSD, если вас не затруднит объясните, что вы хотели сказать следующей фразой  smile 
"Хорошим тоном считается декларировать все выбрасываемые эксепшены, даже если они рантайм. Потому как IDE и прочие анализаторы кода могут использовать эту информацию."

Это сообщение отредактировал(а) revenforv - 6.10.2009, 23:50
PM MAIL Skype   Вверх
duk
Дата 6.10.2009, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Some Object
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 19.7.2007

Репутация: 4
Всего: 4



Можно пойти дальше и обрабатывать исключения деления на 0 или объявлять методы такими, которые могут генерировать математические исключения.
PM MAIL   Вверх
Sibit
Дата 7.10.2009, 04:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.10.2009
Где: NSK

Репутация: нет
Всего: 1



Пример приведен вне контекста, вот я и предложил, что пришло в голову первым. Мы ведь не знаем кто вызывает функцию и откуда берутся параметры. ИМХО, если функцию будет использовать сторонее приложение, то выбрасывать исключение - разумно. Не факт конечно, что именно такое, он это зависит от контекста.
PM MAIL   Вверх
LSD
Дата 7.10.2009, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



1. При чем тут вообще декларирование ексепшенов? Речь то шла об этой фразе:
Цитата(duk @  6.10.2009,  19:56 Найти цитируемый пост)
Вообще обрабатывать ошибки логики считается дурным тоном, потому как они, теоретически должны xD отсутствовать в программе.

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


2. Все зависит от того откуда я получаю индексы для обращения (получаю извне или генерирую сам) к массиву и что это за метод (публичное API или приватное). В случае приватных API и/или самостоятельно вычисленных индексов я ничего не декларирую. В случае публичных API и переданных параметров я ексепшены декларирую.


3. Я считаю, что в публичных API декларировать запланированные RuntimeException нужно обязательно. Это можно сделать используя @throws в JavaDoc или throws, но делать это обязательно нужно.

Например IDEA если у метода задекларировать throws IndexOutOfBoundsException и "окружить" блок кода try/catch то в catch  будет именно IndexOutOfBoundsException, а не более общий Exception.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
duk
Дата 7.10.2009, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Some Object
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 19.7.2007

Репутация: 4
Всего: 4



Цитата(LSD @  7.10.2009,  15:18 Найти цитируемый пост)
1. При чем тут вообще декларирование ексепшенов? Речь то шла об этой фразе:
Цитата(duk @  6.10.2009,  19:56 Найти цитируемый пост)
Вообще обрабатывать ошибки логики считается дурным тоном, потому как они, теоретически должны xD отсутствовать в программе.

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


Когда я это писал, я имел в виду обработку runtime exceptions (выхода за пределы массива или, к примеру деление на 0), при помощи блоков try & catch. Возможно, я не совсем четко выразил свои мысли.

По поводу объявления методов, которые генерируют такие исключения: ИМХО лучше делать, для отдельных случаев, в документации и описывать из-за чего это может произойти. Согласитесь, что 95% методов можно завешать такими объявлениями, так что подходить к этому делу нужно без фанатизма.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0655 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.