Броски вызывают исключение. Исключение будет передаваться обратно в функцию в стек до тех пор, пока оно не будет перехвачено блоком catch, который может его обработать.
Когда в объявление метода помещается ключевое слово throw, это указывает на то, что вызов этого метода может вызвать исключение. Например:
public void methodFoo (int val) throws IllegalArgumentException {
if (val <0) throw new IllegalArgumentExecption();
}
означает, что methodFoo может вызвать исключение типа IllegalArgumentException.
Когда вы вызываете такой метод, вы обычно используете следующий оператор блока try / catch:
try{
methodFoo(int param);
}catch (IllegalArgumentException e){
//if any method call inside methodFoo will raise such exception the execution flow of the program will be interrupted and the execution restart from the first catch block that intercept that execption
}
Преимущество этого подхода в том, что с такой функцией вы не обязаны проверять возвращаемое значение метода, чтобы убедиться, что ваш вызов метода завершился успешно. на языке C вы обычно делаете что-то вроде:
int ret = methodFoo();
if (ret == null){
//error
}