Java 中异常的 throws 关键字

2022-09-01 17:09:08

当您执行此操作时:

public class Blah {

    public void doBlah() throws BlahException {

    }

}

添加真正的作用是什么?throws BlahException

它基本上是否对该异常进行任何分组?即,如果有异常,无论它是什么,将始终使用 ?BlahException


答案 1

它告诉类的客户端 DoBlah 方法可以引发 BlahException 或任何其他扩展它的异常

如果这是一个已检查的异常,编译器将要求他们将对此方法的调用包装在 try/catch 块中。如果未选中,则可以选择不捕获异常,但他们必须注意,如果不这样做,它将在调用堆栈中进一步冒泡。

它没有说明任何未经检查的异常,如NullPointException或错误。这些也总是可以被抛出。它们在 throws 子句中不是必需的。

此代码显示了它的工作原理:

异常演示.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");
    }
}

检查异常.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);
    }
}

未选中异常.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

不。该子句告诉编译器您的函数可能会抛出一个 BlahException,并且这应该由调用方捕获。例如:throws 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();
        }

    }
}

实质上,您是在告诉编译器,此函数可能会引发一个未在函数本身内部处理的异常。这些类型的异常都是的子类,称为已检查异常。其他指示由程序本身中的 bug 而不是由格式错误的输入等条件引起的灾难性故障的异常是 的子类,这些异常称为未经检查的异常。简而言之,可以在方法签名中没有子句的情况下引发未经检查的异常,而必须在此处指示任何已检查的异常。java.lang.Exceptionjava.lang.RuntimeExceptionthrows

有关已选中与未选中异常的讨论,请参阅 http://www.javapractices.com/topic/TopicAction.do?Id=129