исключение обнаружения ошибок, а System.out.print

У меня есть 2 класса, один из которых реализует двойной поиск (int i); и один, где я использую этот поиск (int i) при решении вопроса или, в этом случае, печатаю значения поиска. Этот случай для массива.

Итак, я прочитал документацию по исключениям или google/учебник и пришел со следующим кодом:

public double lookup(int i) throws Exception
{
    if( i > numItems)
        throw new Exception("out of bounds");
    return items[i];        
}

и передайте его моему классу и попробуйте напечатать мой набор, где набор — это имя типа объекта, который я определил в классе выше.

public void print()
{
    for (int i = 0; i < set.size() - 1; i++)
    {
        System.out.print(set.lookup(i) + ",");

    }
    System.out.print(set.lookup(set.size()));
}

Я использую два print(), чтобы избежать последнего "," в печати, но получаю

необработанное исключение Exception (имя моего исключения было Exception)

Я думаю, что мне нужно поймать свое исключение в моем print(), но я не могу найти правильное форматирование в Интернете. Должен ли я писать

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

Такие источники, как http://docs.oracle.com/javase/tutorial/essential/exceptions/ мало помогают мне, я не могу понять, о чем мне говорит текст. У меня также возникают проблемы с поиском источников с несколькими примерами, где я действительно могу понять кодирование в примерах.

Так может ли кто-нибудь дать мне источник/пример приведенной выше крылатой фразы и, возможно, достойный источник примеров для новых программистов Java? моя книга ужасна, и я не могу найти понятный пример для приведенной выше крылатой фразы в Интернете.


person user1702633    schedule 27.09.2012    source источник
comment
вы выдаете исключение, но никогда не обрабатываете его с помощью catch в методе печати.   -  person Mohammadreza Khatami    schedule 26.04.2016


Ответы (4)


Я бы никогда не бросал Exception.

В вашем случае IndexOutOfBoundException или InvalidArgumentException будет лучшим выбором. Поскольку это не проверенные исключения, вам не нужно их перехватывать.

public double lookup(int i) {
    if(i >= numItems) // assuming numItems is not items.length
        throw new IndexOutOfBoundException("out of bounds " + i + " >= " + numItems);
    return items[i];        
}

Примечание: чек должен быть >=

Теперь ваш метод print() будет компилироваться без изменений.

person Peter Lawrey    schedule 27.09.2012
comment
Ему еще предстоит понять Исключение :) Я бы сказал, что это будет передозировка. - person Amit Deshpande; 27.09.2012
comment
о... да, это звучит лучше для этого. Я просто пытался избежать предопределенных инструментов, предоставляемых Java, так как я все еще нахожусь на уровне новичка и хочу попробовать что-то для себя. - person user1702633; 27.09.2012
comment
Почему бы тогда не начать с книги для начинающих, а не бросаться на исключения? На самом деле, одним из сильных сторон Java является тот факт, что вам не нужно делать много вещей самому. - person Shark; 27.09.2012
comment
@Peter Должны ли мы создавать явные исключения для этого конкретного случая? Думаю, ArrayIndexOutOfBoundsException должно быть достаточно. - person Ajay George; 27.09.2012
comment
Вы можете добавить его в предложение throws, если хотите, но в данном случае это необязательно. Я предпочитаю делать это, чтобы было ясно, что исключение может быть выброшено, но в основном потому, что я не всегда пишу javadocs. ;) - person Peter Lawrey; 27.09.2012

Что такое исключение?

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

Типы исключений

  • проверенное исключение

    Это условия, при которых приложение хочет восстановиться. Подобно приведенному выше примеру, приложение выдаст вам ошибку и продолжит работу.

  • Ошибка

    Это исключительное условие, которое является внешним по отношению к приложению. Мы говорим OutOfMemoryError, когда памяти недостаточно и приложение не может ее восстановить.

  • Исключение времени выполнения/непроверенное исключение

    Эти исключения являются исключениями приложений, но в этом случае приложение не может восстановиться после них. Например, NullpointerException, если значение равно null, и вы пытаетесь сделать с ним что-то неприятное.

поэтому из трех вышеперечисленных только проверенные исключения должны кэшироваться.

Как генерировать и перехватывать проверенное исключение

Exception или любой подкласс Exception является проверенным исключением. Проверенное исключение может быть сгенерировано с помощью предложения throw. Как только вы выдаете исключение, вам становится обязательным включить его в объявление метода, используя предложение throws.

Так что тот, кто захочет использовать этот метод, теперь должен будет обработать это исключение. Обработка исключения означает вызов альтернативных потоков. Как и в нашем случае мы отображали текст пользователю "Error Invalid account number."

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

Generate:
public static double withdraw(int i) throws Exception {
    if (i <= 0)// Out of bounds
        throw new Exception("Invalid Account Number");
    return 0.0;// something;
}

Handle:

try {
        withdraw(0);
    } catch (Exception e) {
        // do something with exception here.
        // Log the exception
        System.out.println("Error Invalid account number.");
    }

Propagate:
      public static double callWithdraw(int i) throws Exception {//Propagate exceptions
        return withdraw(i);
      }
person Amit Deshpande    schedule 27.09.2012
comment
но вот чего я не понимаю - зачем мне пытаться вывести (0), если я уже знаю, что i ‹= 0 выходит за пределы, и уже определил его как таковой? Я не понимаю, почему я должен попробовать это, и почему я должен поймать это. Разве не должно быть так, что программа автоматически отлавливает, когда мое if действует? - person user1702633; 27.09.2012
comment
@ user1702633 добавил дополнительную информацию. Надеюсь развеет сомнения. Какой бы класс ни хотел использовать это исключение, он может его использовать. Вы также можете распространять значение исключения, а не обрабатывать его, просто включив его в предложение throws. - person Amit Deshpande; 27.09.2012

Попробуй это

try
{
    print(); //print() needs to throw the same exception
} catch(Exception e)
{
   //handle exception
   System.err.println(e.getMessage()+"\n\n"+e.printStackTrace());
}
//finally {
// cleanup here if you like
// }

или это

public void print()
{
    for (int i = 0; i < set.size() - 1; i++)
    {
        try
        {
            System.out.print(set.lookup(i) + ",");
        } catch(Exception e)
        {
          //handle it here
        }
    }
    System.out.print(set.lookup(set.size()));
}

Обратите внимание, что использование «бросков» — это простой выход; это дешевое делегирование, которое иногда упрощает кодирование... если вы можете, вы должны стараться всегда использовать try/catch вместо throws.

Просто имейте в виду, что всякий раз, когда вы используете что-то с «бросками», в конечном итоге вам придется поместить это в блок try/catch и правильно с этим справиться.

person Shark    schedule 27.09.2012
comment
поэтому я считаю, что мне следует прекратить использовать броски, и мне лучше все время использовать try/catch. Спасибо. - person user1702633; 27.09.2012
comment
Если вы можете справиться с возбуждаемым исключением, то абсолютно. ИМХО, попытка/поймать против бросков похожа на итерацию против рекурсии. Вы узнаете, когда использовать каждый из них :) - person Shark; 27.09.2012
comment
возвращаемый тип e.printStackTrace() недействителен. - person 2787184; 15.03.2018
comment
@ravi, вы правы, я забыл передать ему PrintWriter и собрать его журналы, которые будут иметь тип возврата String. - person Shark; 15.03.2018

Как правило, для обозначения неправильных аргументов, переданных в ваш метод, используйте IllegalArgumentException который является RuntimeException и не должен быть пойман.

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

Брошенный, чтобы указать, что доступ к массиву был осуществлен с недопустимым индексом. Индекс либо отрицателен, либо больше или равен размеру массива.

person Ajay George    schedule 27.09.2012