Могут ли конструкторы создавать исключения в Java?



разрешено ли конструкторам создавать исключения?

566   8  

8 ответов:

да, конструкторы могут создавать исключения. Обычно это означает, что новый объект сразу же подходит для сбора мусора (хотя он может не собираться в течение некоторого времени, конечно). Возможно, что" наполовину построенный " объект будет оставаться вокруг, если он стал видимым ранее в конструкторе (например, назначив статическое поле или добавив себя в коллекцию).

одна вещь, чтобы быть осторожным о генерации исключений в конструкторе: потому что вызывающий (обычно) не будет иметь возможности использовать новый объект, конструктор должен быть осторожен, чтобы избежать приобретения неуправляемых ресурсов (дескрипторы файлов и т. д.), а затем бросать исключение, не освобождая их. Например, если конструктор пытается открыть FileInputStream и FileOutputStream, и первый успешно, но второй терпит неудачу, вы должны попытаться закрыть первый поток. Это становится сложнее, если это конструктор подкласса, который бросает исключение, конечно... все это становится немного сложнее. Это не проблема очень часто, но ее стоит рассмотреть.

Да, они могут бросать исключения. Если это так, то они будут только частично инициализированы и, если не являются окончательными, подвержены атаке.

следующее из Secure Coding Guidelines 2.0.

частично инициализированные экземпляры неокончательного класса могут быть доступны через атаку финализатора. Злоумышленник переопределяет метод finalize защищены в подклассе, и пытается создать новый экземпляр этого подкласса. Эта попытка не удается (в приведенном выше например, проверка SecurityManager в конструкторе загрузчика классов вызывает исключение безопасности), но злоумышленник просто игнорирует любое исключение и ждет, пока виртуальная машина выполнит завершение для частично инициализированного объекта. Когда это происходит, вызывается вредоносная реализация метода finalize, предоставляя злоумышленнику доступ к этому, ссылка на завершаемый объект. Хотя объект инициализирован только частично, злоумышленник все еще может вызывать методы на нем (тем самым обход проверки SecurityManager).

абсолютно.

Если конструктор не получает допустимый ввод или не может построить объект допустимым образом, у него нет другого варианта, кроме как вызвать исключение и предупредить его вызывающего.

Да, он может бросить исключение, и вы можете объявить, что в сигнатуре конструктора тоже, как показано в примере ниже:

public class ConstructorTest
{
    public ConstructorTest() throws InterruptedException
    {
        System.out.println("Preparing object....");
        Thread.sleep(1000);
        System.out.println("Object ready");
    }

    public static void main(String ... args)
    {
        try
        {
            ConstructorTest test = new ConstructorTest();
        }
        catch (InterruptedException e)
        {
            System.out.println("Got interrupted...");
        }
    }
}

да, конструкторы могут создавать исключения.

однако, будьте очень мудры в выборе того, какие исключения они должны быть-проверенные исключения или непроверенные. Непроверенные исключения в основном являются подклассами RuntimeException.

почти во всех случаях (я не мог придумать исключение для этого случая), вам нужно будет бросить проверенное исключение. Причина в том, что непроверенные исключения (например, NullPointerException) обычно связаны с ошибками программирования (например, нет достаточная проверка входных данных).

преимущество, которое предлагает проверенное исключение, заключается в том, что программист вынужден ловить исключение в своем коде создания экземпляра и тем самым понимает, что может произойти сбой при создании экземпляра объекта. Конечно, только обзор кода поймает плохую практику программирования проглатывания исключения.

да.

конструкторы являются не более чем специальными методами и могут создавать исключения, как и любой другой метод.

конструктор может бросить исключение. Но если какой-либо конструктор подкласса вызывает конструктор суперкласса, который вызывает исключение, то конструктор подкласса должен либо поймать исключение, либо бросить его.

да, он может бросить исключение, как и другие метод

Comments

    Ничего не найдено.