Что делает "Броски" и как это полезно?

Я новичок в Java и только что наткнулся на учебник, в котором используется ключевое слово "Броски" в методе. Я немного поработал над этим, но все еще не понимаю.

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

Ответ 1

Вы можете управлять исключением в методе, используя try и catch, как вы говорите. В этом случае вам не нужно использовать throws. Например:

public void myMethod()
{
  try {
    /* Code that might throw an exception */
  }
  catch (SpaceInvadersException exception) {
    /* Complicated error handling code */
  }
}

Но предположим, что у вас было тысяча методов, все из которых могли бы выбросить SpaceInvadersException. Тогда вам придется писать весь сложный код обработки ошибок тысячу раз. Конечно, вы всегда можете создать класс ErrorHandler с помощью метода dealWithSpaceInvadersException(), который вы могли бы назвать от них, но вы все равно будете застрять с тысячами блоков try - catch.

Вместо этого вы сообщаете компилятору, что каждая из этих тысяч методов может вызывать SpaceInvadersException. Тогда любой метод, который вызывает один из этих методов, должен иметь дело с самой ошибкой либо с помощью try - catch, либо путем сообщения компилятору, что он может выбросить SpaceInvadersException. Это делается с помощью ключевого слова throws, например:

public void myMethod() throws SpaceInvadersException
{
  /* Code that might throw an exception */
}

public void callingMethod()
{
  try {
    myMethod();
  }
  catch (SpaceInvadersException exception) {
    /* Complicated error handling code */
  }
}

В этом случае вам нужно сообщить компилятору, что myMethod может выбрать SpaceInvadersException. Это означает, что вы не можете вызвать этот метод, не обращаясь к исключению каким-либо образом (try - catch или используя ключевое слово throws для вызывающего метода). Если throws там не было, вы можете вызвать метод без обработки исключений и получить исключение, которое не было бы обработано нигде в программе (что было бы плохо).

Так как всегда лучше избегать дублирования кода, обычно лучше отвлечь обработку ошибок до try - catch в функции гораздо более высокого уровня, чем для того, чтобы иметь дело с ним отдельно во всех методы низкого уровня. Вот почему этот механизм существует.

Ответ 2

Ключевое слово throws объявляет, что исключение может быть выбрано out метода.

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

Объявление

A throws позволяет проверять время компиляции, что метод:

  • Улавливает исключения, которые он выбрасывает, включая те из методов, которые он вызывает.
  • Или объявляет их, чтобы вызывающие вызывали эту же проверку.

Ответ 3

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

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

Ответ 4

Броски - это механизм для исключения исключения из вызывающего метода. Обычно это используется для того, чтобы исключить исключение из уровня, на котором он может быть обработан.

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

Ответ 5

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

Например: class Abc { public static void main(String args[]) throws IOException{ }}