Подтвердить что ты не робот

Ключевое слово throw для исключений в Java

когда вы это сделаете:

public class Blah {

    public void doBlah() throws BlahException {

    }

}

Что добавляет throws BlahException действительно?

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

4b9b3361

Ответ 1

Он сообщает клиентам вашего класса, что метод DoBlah может вызывать исключение BlahException или любое другое исключение, которое его расширяет.

Если это проверенное исключение, компилятор потребует, чтобы они переносили вызовы этого метода в блок try/catch. Если он не установлен, они могут отказаться от исключения, но им необходимо знать, что если они этого не сделают, он будет раздуваться вверх по стеке вызовов.

В нем ничего не говорится об исключенных исключениях, таких как NullPointException или ошибки. Их всегда можно бросить. Они не требуются в предложении бросков.

Этот код показывает, как он работает:

ExceptionDemo.java:

package exceptions;

public class ExceptionDemo
{
    public static void main(String[] args)
    {
        ExceptionDemo demo = new ExceptionDemo();

        try
        {
            // Removing the try/catch will result in a compilation error
            demo.doChecked();            
        }
        catch (CheckedException e)
        {
            e.printStackTrace();
        }

        // Note: Not inside a try/catch, in spite of the throws clause
        demo.doUnchecked();
    }

    public void doChecked() throws CheckedException
    {
        System.out.println("doing something that may throw a checked exception");
    }

    // Note: "throws" clause is unnecessary for an unchecked exception
    public void doUnchecked() throws UncheckedException
    {
        System.out.println("doing something that may throw an unchecked exception");
    }
}

CheckedException.java:

package exceptions;

public class CheckedException extends Exception
{
    public CheckedException()
    {
        super();
    }

    public CheckedException(String message)
    {
        super(message);
    }

    public CheckedException(String message, Throwable cause)
    {
        super(message, cause);
    }

    public CheckedException(Throwable cause)
    {
        super(cause);
    }
}

UncheckedException.java:

package exceptions;

public class UncheckedException extends RuntimeException
{
    public UncheckedException()
    {
        super();
    }

    public UncheckedException(String message)
    {
        super(message);
    }

    public UncheckedException(String message, Throwable cause)
    {
        super(message, cause);
    }

    public UncheckedException(Throwable cause)
    {
        super(cause);
    }
}

Ответ 2

Нет. предложение throws BlahException сообщает компилятору, что ваша функция может вызывать исключение BlahException и что это должно быть уловлено вызывающим. Например:

class ExceptionThrower
{
    void someFunction()
    {
        for(int i =0; i<10;i++)
            if(i==4) throw new Exception();
    }

    public static void main(String args[])
    {
        new ExceptionThrower().someFunction();
    }
}

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

Однако следующий код будет скомпилирован.

class ExceptionThrower
{
    void someFunction() throws Exception
    {
        for(int i =0; i<10;i++)
            if(i==4) throw new Exception();
    }

    public static void main(String args[])
    {
        try
        {
            new ExceptionThrower().someFunction();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }
}

По сути, вы сообщаете компилятору, что эта функция может генерировать исключение, которое не обрабатывается внутри самой функции. Эти типы исключений - все подклассы java.lang.Exception и называются проверенными исключениями. Другие исключения, которые указывают на катастрофический сбой, вызванный ошибками в самой программе, а не условием, таким как неправильный ввод, являются подклассами java.lang.RuntimeException, и они называются неконтролируемыми исключениями. Короче говоря, необработанные исключения могут быть выбрасываться без предложения throws в сигнатуре метода, в то время как любые проверенные исключения должны указываться там.

Для обсуждения исключенных или исключенных исключений см. http://www.javapractices.com/topic/TopicAction.do?Id=129

Ответ 3

Вся идея заключается в том, что без ключевого слова throws исключение, созданное методом, невозможно обработать вне метода.

Разве это не так?

Ответ 4

В вашем методе doBlah() должно быть что-то, что может throw BlahException или любой подкласс BlahException. Это говорит вызывающему абоненту doBlah(), чтобы быть осторожным, чтобы обернуть код в try-catch.