Может кто-то, пожалуйста, помогите мне понять, почему мне нужно использовать (внутренний) try catch, если метод объявлен как бросающий одно и то же исключение.
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new Runnable() {
public void run() {
// TODO Auto-generated method stub
try {
producer();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
t1.start();
t1.join();
}
синтаксис производителя()
private static void producer() throws InterruptedException
Ответ заключается в том, что вы определяете анонимный класс.
Thread t1 = new Thread(new Runnable() {
public void run() {
try {
producer(); //This is called in run method!
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Объявление метода, вызывающего producer()
является public void run()
и этот метод не выдает проверенное исключение. Поэтому вы должны поймать его.
Это логично, потому что вы начинаете новый поток, который может жить после выполнения, оставляет метод создания (если он не был main
методом и если вы не использовали Thread.join()
). Поэтому вы должны обрабатывать исключение самостоятельно.