📜  Java中的throw

📅  最后修改于: 2020-04-05 06:56:30             🧑  作者: Mango

throw

Java中的throw关键字用于显式引发方法或任何代码块中的异常。我们可以抛出checked或unchecked异常。throw关键字主要用于引发自定义异常。
语法:

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

但是这个例外就是,实例的类型必须为Throwable的或子类的Throwable。例如,Exception是Throwable的子类,用户定义的异常通常扩展Exception类。与C++不同,不能将诸如int,char,floats或不可抛出类的数据类型用作异常。
程序在执行throw语句后立即停止执行流程,并检查最近的封闭try块以查看其是否具有与异常类型匹配的catch语句。如果找到匹配项,则将控制权转移到该语句,否则检查下一个封闭的try块,依此类推。如果找不到匹配的try,则默认的异常处理程序将暂停程序。

// Java程序展示throw
class ThrowExcep
{
    static void fun()
    {
        try
        {
            throw new NullPointerException("demo");
        }
        catch(NullPointerException e)
        {
            System.out.println("在fun()中捕获.");
            throw e; // 重新抛出异常
        }
    }
    public static void main(String args[])
    {
        try
        {
            fun();
        }
        catch(NullPointerException e)
        {
            System.out.println("在main中捕获.");
        }
    }
}

输出:

在fun()中捕获.
在main中捕获.

另一个例子:

// Java程序展示throw
class Test
{
    public static void main(String[] args)
    {
        System.out.println(1/0);
    }
}

输出:

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

throws

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程序展示没有处理的异常
class tst
{
    public static void main(String[] args)
    {
        Thread.sleep(10000);
        System.out.println("Hello 芒果");
    }
}

输出:

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

说明:在上面的程序中,由于主线程要进入睡眠状态,因此有发生异常的机会,而其他线程则有机会执行main()方法,这将导致InterruptedException,从而导致编译时错误。

// Java程序,展示如何使用throws
class tst
{
    public static void main(String[] args)throws InterruptedException
    {
        Thread.sleep(10000);
        System.out.println("Hello 芒果");
    }
}

输出:

Hello 芒果

说明:在上面的程序中,通过使用throws关键字,我们处理了InterruptedException,并且将得到输出为Hello 芒果
另一个例子:

// Java程序,展示如何使用throws
class ThrowsExecp
{
    static void fun() throws IllegalAccessException
    {
        System.out.println("在fun()内. ");
        throw new IllegalAccessException("demo");
    }
    public static void main(String args[])
    {
        try
        {
            fun();
        }
        catch(IllegalAccessException e)
        {
            System.out.println("在main内捕获.");
        }
    }
}

输出:

在fun()内.
在main内捕获.

请记住有关throws关键字的要点:

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