Страницы

Поиск по вопросам

четверг, 5 декабря 2019 г.

Зачем в данной ситуации создавать конструктор и указывать у него throws?

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

Комментариев нет:

Отправить комментарий