Java中异常的throws关键字

Java中异常的throws关键字,java,exception,Java,Exception,执行此操作时: public class Blah { public void doBlah() throws BlahException { } } 添加抛出BlahException的真正作用是什么 它基本上是否将任何例外归为该类?i、 e.如果存在异常,无论它是什么,将始终使用BlahException?抛出异常。它告诉类的客户端,DoBlah方法可以抛出BlahException或任何其他扩展它的异常 如果它是一个选中的异常,编译器将要求它们将对此方法的调用包装在

执行此操作时:

public class Blah {

    public void doBlah() throws BlahException {

    }

}
添加
抛出BlahException
的真正作用是什么


它基本上是否将任何例外归为该类?i、 e.如果存在异常,无论它是什么,将始终使用
BlahException

抛出异常。它告诉类的客户端,DoBlah方法可以抛出BlahException或任何其他扩展它的异常

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

它没有提到任何未检查的异常,如NullPointException或错误。这些也可以随时扔掉。在throws子句中不需要它们

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

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);
    }
}
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);
    }
}
UncheckedException.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);
    }
}
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);
    }
}

否。
抛出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();
    }
}
本质上,您是在告诉编译器,此函数可能会抛出一个未在函数本身内部处理的异常。这些类型的异常都是
java.lang.Exception
的子类,称为检查异常。其他异常表示由程序本身中的错误而不是输入格式错误等情况导致的灾难性故障,它们是
java.lang.RuntimeException
的子类,称为未检查异常。简而言之,可以在方法签名中不使用
throws
子句的情况下抛出未经检查的异常,而必须在其中指示任何已检查的异常


有关已检查异常与未检查异常的讨论,请参见

您的方法
doBlah()
需要能够
抛出
BlahException
的任何子类。这告诉
doBlah()
的调用者通常要小心地将代码包装在
try catch
中。整个想法是,如果没有
抛出
关键字,方法引发的异常就不能在方法之外处理


是吗?

奇怪的是,我在Java教程()中根本没有提到异常。多么奇怪的遗漏。出于好奇,您如何确切地指定(用户定义的)异常应该被检查还是不检查?它是像在“throws”部分中显示一样简单,还是在exception类本身中必须执行某些操作?@skaffman exception包含在基本Java类()中而不是学习Java语言。@未经检查的异常是那些从Java.lang.RuntimeException或Java.lang.Error扩展而来的异常,也就是说,在定义用户定义的异常时,它归结为您指定的超类。啊,如果它从Java.lang.exception扩展而来,并且我在throws子句中指定它,它必须是已检查的异常?对于未检查的异常,情况并非如此。出于文档原因,它们可以在方法签名中声明,但不需要被客户端捕获。