#java
Почему в public static void main оператор throws пишется в сигнатуре метода, то есть
вот так:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class Test {
public static void main(String[] args) throws FileNotFoundException {
FileInputStream fileInputStream = new FileInputStream("path");
}
}
А если класс без public static void main, и я пишу вот так:
import java.io.FileInputStream;
public class Excep {
FileInputStream fileInputStream = new FileInputStream("path");
}
то IDEA подсказывает, что нужно обработать это в конструкции try, catch или же оператором
throws. Я сделал как подсказывала IDEA с оператором throws:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class Excep {
FileInputStream fileInputStream = new FileInputStream("path");
public Excep() throws FileNotFoundException {
}
}
Почему здесь создался конструктор и для него мы написали оператор throws?
Ответы
Ответ 1
При создании объекта Excep произойдёт несколько действий, для вопроса важны два: Вызывается конструктор. Если нет явных конструкторов, вызывается конструктор по умолчанию В рамках выполнения конструктора происходит инициализация полей объекта. Если инициализация какого-то поля приводит к появлению исключения, то создание объекта прерывается, а исключение пробрасывается "вверх" Также нужно учитывать, что если вызов метода или конструктора может приводить к пробросу исключения, то это должно быть указано в сигнатуре с помощью throws ... Так как конструктор Excep может приводить к появлению FileNotFoundException, а конструктор по умолчанию не содержит конструкции throws ..., то нужно создать явный конструктор и указать, что его вызов может приводить к возникновению FileNotFoundException. Что, собственно, и предлагает среда разработки Чтобы конструктор в данной ситуации не пробрасывал исключение, оно должно обрабатываться в нём. Но в этом случае всё равно придётся создать конструктор (и перенести в него инициализацию fileInputStream). И, главное, ловить исключение в конструкторе нужно осознанно тогда, когда это действительно нужноОтвет 2
потому что fileInputStream = new FileInputStream("path")будет размещено в конструкторе. Это некий выполняемый код, его же надо где-то разместить так, чтобы он исполнился при создании объекта. И единственное такое место - это конструктор.
Комментариев нет:
Отправить комментарий