#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")будет размещено в конструкторе. Это некий выполняемый код, его же надо где-то разместить так, чтобы он исполнился при создании объекта. И единственное такое место - это конструктор.
Комментариев нет:
Отправить комментарий