Почему «вызывает исключение» необходимо при вызове функции?

class throwseg1
{
    void show() throws Exception
    {
        throw new Exception("my.own.Exception");
    }

    void show2() throws Exception  // Why throws is necessary here ?
    {
        show();
    }

    void show3() throws Exception  // Why throws is necessary here ?
    {
        show2();
    }

    public static void main(String s[]) throws Exception  // Why throws is necessary here ?
    {
        throwseg1 o1 = new throwseg1();
        o1.show3();
    }
}

Почему компилятор сообщает, что методы show2(), show3() и main() есть

  

незарегистрированное исключение Исключение, которое должно быть перехвачено или объявлено как выброшенное

когда я удаляю throws Exception из этих методов?

68 голосов | спросил nr5 21 J000000Saturday12 2012, 07:52:27

5 ответов


0

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

введите описание изображения здесь

В Java вы можете выбросить все, что расширяет класс Throwable. Однако вам не нужно указывать предложение throws для всех классов. В частности, классы, которые являются Error или RuntimeException или любой из подклассов этих двух. В вашем случае Exception не является подклассом Error или RuntimeException. Таким образом, это проверенное исключение, которое должно быть указано в предложении throws, если вы не обработали это конкретное исключение. Вот почему вам нужно было предложение throws.


Из учебника по Java :

  

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

Теперь, как вы знаете, исключения делятся на две части: проверенные и непроверенные. Почему эти классификации?

Проверенное исключение: они используются для представления проблем, которые могут быть устранены во время выполнения программы. Они обычно не вина программиста. Например, указанный пользователем файл недоступен для чтения, или нет доступного сетевого подключения и т. Д. Во всех этих случаях нашей программе не нужно закрываться, вместо этого она может выполнять действия, такие как оповещение пользователя, или переходить в резервный режим. механизм (например, автономная работа, когда сеть недоступна) и т. д.

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

  • Исключения времени выполнения: они обычно происходят из-за ошибки программистов. Например, если происходит ArithmeticException деления на ноль или ArrayIndexOutOfBoundsException происходит потому, что мы недостаточно осторожны в кодировании. Обычно они происходят из-за некоторых ошибок в логике нашей программы. Таким образом, они должны быть очищены, прежде чем наша программа перейдет в рабочий режим. Они не проверяются в том смысле, что наша программа должна завершиться сбоем, когда она произойдет, чтобы мы, программисты, могли разрешить ее во время разработки и самого тестирования.

  • Ошибки: ошибки - это ситуации, из-за которых программа обычно не может восстановиться. Например, если происходит StackOverflowError, наша программа не может многое сделать, например, увеличить размер стека вызовов функций программы. Или, если возникнет OutOfMemoryError, мы не сможем сделать много для увеличения объема оперативной памяти, доступной для нашей программы. В таких случаях лучше выйти из программы. Вот почему они сделаны непроверенными.

Для получения подробной информации см .:

ответил Jomoos 21 J000000Saturday12 2012, 08:11:04
0

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

ответил Taymon 21 J000000Saturday12 2012, 07:53:50
0

Объявление throws Exception - это автоматизированный способ отслеживания методов, которые могут вызвать исключение по ожидаемым, но неизбежным причинам. Объявление, как правило, специфично для типа или типов исключений, которые могут быть выданы, таких как throws IOException или throws IOException, MyException

У всех нас есть или мы в конечном итоге напишем код, который неожиданно останавливается и сообщает об исключении из-за чего-то, чего мы не ожидали перед запуском программы, например деление на ноль или индекс за пределами границ. Поскольку ошибки не ожидались методом, их нельзя было «перехватить» и обработать с помощью предложения try catch. Любые ничего не подозревающие пользователи метода также не будут знать об этой возможности, и их программы также остановятся.

Когда программист знает, что могут возникать определенные типы ошибок, но хотел бы обработать эти исключения вне метода, метод может «выбросить» один или несколько типов исключений в вызывающий метод вместо их обработки. Если программист не объявил, что метод (может) выдать исключение (или если у Java не было возможности объявить его), компилятор не мог бы знать, и о нем должен знать будущий пользователь метода, ловить и обрабатывать любые исключения, которые может выдать метод. Поскольку программы могут иметь многоуровневые методы, написанные многими различными программами, становится трудно (невозможно) отслеживать, какие методы могут генерировать исключения.

Несмотря на то, что в Java есть возможность объявлять исключения, вы все равно можете написать новый метод с необработанными и необъявленными исключениями, и Java скомпилирует его, и вы сможете запустить его и надеяться на лучшее. Что Java не позволит вам сделать, так это скомпилировать ваш новый метод, если он использует метод, который был объявлен как выбрасывающий исключение (я), если вы не обрабатываете объявленное исключение (я) в вашем методе или не объявляете свой метод как выбрасывающий то же самое исключение (я) или, если есть несколько исключений, вы можете обработать некоторые и выбросить остальные.

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

Хорошая вещь в этом типе решения состоит в том, что когда компилятор сообщает Error: Unhandled exception type java.io.IOException, он дает номер файла и номер строки метода, который было объявлено, чтобы бросить исключение. Затем вы можете просто отказаться от бакса и объявить, что ваш метод также «вызывает IOException». Это может быть выполнено вплоть до метода main, после чего программа остановится и сообщит об исключении пользователю. Однако лучше поймать исключение и разобраться с ним, например, объясняя пользователю, что произошло, и как это исправить. Когда метод перехватывает и обрабатывает исключение, ему больше не нужно объявлять исключение. Доллар останавливается там, так сказать.

ответил dansalmo 15 52013vEurope/Moscow11bEurope/MoscowFri, 15 Nov 2013 22:18:39 +0400 2013, 22:18:39
0
package javaexception;


public class JavaException {
   void show() throws Exception
    {
        throw new Exception("my.own.Exception");
    }

void show2() throws Exception  // Why throws is necessary here ?
{
    show();
}

void show3() throws Exception  // Why throws is necessary here ?
{
    show2();
}
public static void main(String[] args) {

   JavaException a = new JavaException();

   try{
   a.show3();
   }catch(Exception e){
       System.out.println(e.getMessage());
   }
}

Только небольшие изменения в вашей программе. Многие, похоже, неправильно понимают основную проблему: всякий раз, когда вы генерируете исключение, вы должны его обрабатывать, не обязательно в том же месте (например, метод show1,2,3 в вашей программе), но сначала вы должны вызывать метод внутри «основного». одним словом, есть «throw», должен быть «catch /try», даже если это не тот же метод, где происходит исключение.

ответил tawess 15 MaramThu, 15 Mar 2018 11:11:39 +03002018-03-15T11:11:39+03:0011 2018, 11:11:39
0
void show() throws Exception
{
    throw new Exception("my.own.Exception");
}

Поскольку в методе show () есть проверенное исключение, которое в этом методе не обрабатывается, поэтому мы используем ключевое слово throws для распространения исключения.

void show2() throws Exception //Why throws is necessary here ?
{
show();
}

Поскольку вы используете метод show () в методе show2 (), и вы распространили исключение по крайней мере, вы должны обрабатывать его здесь. Если вы здесь не обрабатываете исключение, вы используете ключевое слово throws. Вот почему мы используем ключевое слово throws в сигнатуре метода.

ответил Aditya 8 PMpSun, 08 Apr 2018 20:43:33 +030043Sunday 2018, 20:43:33

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132