Может ли кто-нибудь из вас объяснить, в чем разница между throw
, throws
и Throwable
и когда что использовать?
Обработка исключений: throw, throws и Throwable
Ответы (8)
throws
: используется при написании методов, чтобы объявить, что рассматриваемый метод выдает указанное (проверенное) исключение.В отличие от проверенных исключений, исключения времени выполнения (NullPointerExceptions и т. д.) могут быть вызваны без объявления метода
throws NullPointerException
.throw
: Инструкция для фактического создания исключения. (или, точнее, Throwable).За ключевым словом throw следует ссылка на
Throwable
(обычно исключение).
Пример:
Throwable
: класс, который вы должны расширить, чтобы создать свой собственный метательный.
Пример:
throw
: оператор для создания объектаt
, гдеt instanceof java.lang.Throwable
должно быть истинным.throws
: токен подписи метода для указания проверенных исключенийthrow
n этим методом.java.lang.Throwable
: родительский тип всех объектов, которые можно бросать (и ловить).
См. здесь руководство по использованию исключений.
Это действительно легко понять.
java.lang.Throwable:
Класс
Throwable
является надклассом всех ошибок и исключений в языке Java. Только объекты, которые являются экземплярами этого класса (или одного из его подклассов), выбрасываются виртуальной машиной Java или могут быть выброшены оператором Javathrow
. Точно так же только этот класс или один из его подклассов может быть типом аргумента в предложенииcatch
. Дополнительно
Ключевое слово throws используется в объявлении метода, это указывает, какое исключение [класс Throwable] мы можем ожидать от этого метода.
Ключевое слово throw используется для создания объекта, который является экземпляром класса Throwable.
Чтобы увидеть пример:
Создаем себе класс исключения
public class MyException super Exception {
}
Мы создаем метод, который создает объект из нашего класса исключений и выбрасывает его с помощью ключевого слова throw.
private void throwMeAException() throws MyException //We inform that this method throws an exception of MyException class
{
Exception e = new MyException (); //We create an exception
if(true) {
throw e; //We throw an exception
}
}
Когда мы собираемся использовать метод throwMeAException()
, мы вынуждены позаботиться о нем особым образом, потому что у нас есть информация о том, что он что-то выдает, в этом случае у нас есть три варианта.
Первый вариант использует блокировку try и catch для обработки исключения:
private void catchException() {
try {
throwMeAException();
}
catch(MyException e) {
// Here we can serve only those exception that are instance of MyException
}
}
Второй вариант - передать исключение
private void passException() throws MyException {
throwMeAException(); // we call the method but as we throws same exception we don't need try catch block.
}
Третий вариант - поймать и повторно выдать исключение
private void catchException() throws Exception {
try {
throwMeAException();
}
catch(Exception e) {
throw e;
}
}
Возобновляя, когда вам нужно остановить какое-то действие, вы можете сгенерировать исключение, которое будет возвращаться до тех пор, пока не станет сервером с помощью некоторого блока try-catch. Где бы вы ни использовали метод, выбрасывающий исключение, вы должны обрабатывать его блоком try-catch или добавлять объявления к своим методам.
Исключением из этого правила являются java.lang.RuntimeException
те, которые не нужно объявлять. Это отдельная история как аспект использования исключений.
throw — используется для создания исключения. Для оператора throw требуется один аргумент: объект класса throwable.
throws — используется для указания того, что метод может генерировать исключение
Throwable — это надкласс всех ошибок и исключений в языке Java. вы можете выбрасывать только объекты, производные от класса Throwable. throwable содержит снимок стека выполнения своего потока на момент его создания
Throw
используется для генерации исключения, throws
(если я правильно догадался) используется для указания того, что метод может генерировать конкретное исключение, а класс Throwable
является надклассом всех ошибок и исключений в Java.
Выбросить:
используется для фактического создания исключения, тогда как throws является декларативным для метода. Они не взаимозаменяемы.
throw new MyException("Exception!);
Выдает:
Это следует использовать, когда вы не используете оператор try catch в своем коде, но знаете, что этот конкретный класс способен генерировать такое-то и такое-то исключение (только проверенные исключения). В этом вы не используете блок try catch, а пишете, используя предложение throw в соответствующей точке вашего кода, и исключение выдается вызывающему методу и обрабатывается им. Также ключевое слово throws используется, когда функция может генерировать проверенное исключение.
public void myMethod(int param) throws MyException
Существует 2 основных типа исключений:
Исключения во время выполнения (неотмеченные): например. NullPointerException, ClassCastException,..
Проверенные исключения: например. FileNotFoundException, CloneNotSupportedException, ..
Исключения времени выполнения — это исключения, возникающие во время выполнения, и разработчик не должен пытаться их перехватывать или останавливать. Вы пишете код только для того, чтобы их избежать, или выдаете команду throw, когда выполняются критерии ошибки. Мы используем throw внутри тела метода.
public Rational(int num, int denom){
if(denom <= 0) {
throw new IllegalArgumentException("Denominator must be positive");
}
this.num=num;
this.denom=denom;
}
Однако для проверенных исключений JVM ожидает, что вы их обработаете, и выдаст ошибку компилятора, если она не будет обработана, поэтому вы объявляете, что он выдает этот тип исключения, как показано ниже в методе clone().
Class Employee{
public Employee clone() throws CloneNotSupportedException{
Employee copy = (Employee)super.clone();
copy.hireDate = (Date)hireDate.clone();
return copy;
}
}
Тот же ответ, что и выше, но с удовольствием от копирования и вставки:
public class GsonBuilderHelper {
// THROWS: method throws the specified (checked) exception
public static Object registerAndRun(String json) throws Exception {
// registering of the NaturalDeserializer
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Object.class, new NaturalDeserializer());
Gson gson = gsonBuilder.create();
Object natural = null;
try {
// calling the NaturalDeserializer
natural = gson.fromJson(json, Object.class);
} catch (Exception e) {
// json formatting exception mainly
Log.d("GsonBuilderHelper", "registerAndRun(json) error: " + e.toString());
throw new Exception(e); // <---- THROW: instance of class Throwable.
}
return natural;
}
}
throw
класса Throwable, а также ключевое словоthrows
, используемое в заголовках методов. Это две совершенно разные вещи. Сначала забудьте оthrows
и просто выясните, что делаетthrow
.throws
требуется только для того, чтобы компилятор был доволен. - person Hot Licks   schedule 09.01.2015