📜  Java中的 throw 和 throws

📅  最后修改于: 2022-05-13 01:55:25.207000             🧑  作者: Mango

Java中的 throw 和 throws

Java中的 throw 关键字用于显式地从方法或任何代码块中抛出异常。我们可以抛出已检查或未检查的异常。 throw 关键字主要用于抛出自定义异常。

句法:

throw Instance
Example:
throw new ArithmeticException("/ by zero");

但是这个例外,即Instance必须是Throwable类型或Throwable的子类。例如 Exception 是 Throwable 的子类,用户定义的异常通常扩展 Exception 类。与 C++ 不同,int、char、float 或不可抛出类等数据类型不能用作异常。

程序的执行流程在 throw 语句执行后立即停止,并检查最近的封闭try块是否有与异常类型匹配的catch语句。如果找到匹配项,则将控制转移到该语句,否则检查下一个封闭的try块,依此类推。如果没有找到匹配的catch ,则默认的异常处理程序将停止程序。

Java
// Java program that demonstrates the use of throw
class ThrowExcep
{
    static void fun()
    {
        try
        {
            throw new NullPointerException("demo");
        }
        catch(NullPointerException e)
        {
            System.out.println("Caught inside fun().");
            throw e; // rethrowing the exception
        }
    }
 
    public static void main(String args[])
    {
        try
        {
            fun();
        }
        catch(NullPointerException e)
        {
            System.out.println("Caught in main.");
        }
    }
}


Java
// Java program that demonstrates the use of throw
class Test
{
    public static void main(String[] args)
    {
        System.out.println(1/0);
    }
}


Java
// Java program to illustrate error in case
// of unhandled exception
class tst
{
    public static void main(String[] args)
    {
        Thread.sleep(10000);
        System.out.println("Hello Geeks");
    }
}


Java
// Java program to illustrate throws
class tst
{
    public static void main(String[] args)throws InterruptedException
    {
        Thread.sleep(10000);
        System.out.println("Hello Geeks");
    }
}


Java
// Java program to demonstrate working of throws
class ThrowsExecp
{
    static void fun() throws IllegalAccessException
    {
        System.out.println("Inside fun(). ");
        throw new IllegalAccessException("demo");
    }
    public static void main(String args[])
    {
        try
        {
            fun();
        }
        catch(IllegalAccessException e)
        {
            System.out.println("caught in main.");
        }
    }
}


输出:

Caught inside fun().
Caught in main.

另一个例子:

Java

// Java program that demonstrates the use of throw
class Test
{
    public static void main(String[] args)
    {
        System.out.println(1/0);
    }
}

输出:

Exception in thread "main" java.lang.ArithmeticException: / by zero

投掷

throws 是Java中的一个关键字,用于方法的签名中,表示该方法可能会抛出列出的类型异常之一。这些方法的调用者必须使用 try-catch 块来处理异常。

句法:

type method_name(parameters) throws exception_list
exception_list is a comma separated list of all the 
exceptions which a method might throw.

在程序中,如果有可能引发异常,那么编译器总是会警告我们,并且强制我们应该处理已检查的异常,否则我们会得到编译时错误,说必须捕获或声明未报告的异常 XXX 被抛出。为了防止这种编译时错误,我们可以通过两种方式处理异常:

  1. 通过使用 try catch
  2. 通过使用throws关键字

我们可以使用 throws 关键字将异常处理的责任委托给调用者(可能是方法或 JVM),然后调用者方法负责处理该异常。

Java

// Java program to illustrate error in case
// of unhandled exception
class tst
{
    public static void main(String[] args)
    {
        Thread.sleep(10000);
        System.out.println("Hello Geeks");
    }
}

输出:

error: unreported exception InterruptedException; must be caught or declared to be thrown

解释:在上面的程序中,我们得到编译时错误,因为如果主线程进入睡眠状态,则有可能出现异常,其他线程有机会执行 main() 方法,这将导致 InterruptedException。

Java

// Java program to illustrate throws
class tst
{
    public static void main(String[] args)throws InterruptedException
    {
        Thread.sleep(10000);
        System.out.println("Hello Geeks");
    }
}

输出:

Hello Geeks

说明:在上面的程序中,我们使用 throws 关键字处理了 InterruptedException,我们将得到输出为Hello Geeks

另一个例子:

Java

// Java program to demonstrate working of throws
class ThrowsExecp
{
    static void fun() throws IllegalAccessException
    {
        System.out.println("Inside fun(). ");
        throw new IllegalAccessException("demo");
    }
    public static void main(String args[])
    {
        try
        {
            fun();
        }
        catch(IllegalAccessException e)
        {
            System.out.println("caught in main.");
        }
    }
}

输出:

Inside fun().
caught in main.

关于 throws 关键字要记住的要点:

  • throws 关键字仅对已检查的异常是必需的,对未检查的异常使用 throws 关键字是没有意义的。
  • throws 关键字仅用于说服编译器,并且 throws 关键字的使用不会防止程序异常终止。
  • 在 throws 关键字的帮助下,我们可以向方法的调用者提供有关异常的信息。

参考: Java – Herbert Schildt 的完整参考