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 被抛出。为了防止这种编译时错误,我们可以通过两种方式处理异常:
- 通过使用 try catch
- 通过使用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 的完整参考