Java throw关键字

Java throw关键字

原文: https://howtodoinjava.com/java/exception-handling/throw-vs-throws/

在 Java 异常处理中,throw关键字用于显式抛出方法或构造器中的异常。throws`关键字**用于声明该方法或构造器可能抛出的异常列表。

1. Java throw关键字

1.1 语法

要从方法或构造器引发异常,请使用throw关键字以及异常类的实例。

public void method() 
{
   //throwing an exception
   throw new SomeException("message");
}

1.2 处理受检与非受检异常

如果我们从方法中抛出非受检的异常,则处理该异常或在throws子句中声明不是强制性的。 例如,NullPointerException是非受检的异常。

public class JavaExample 
{
	public static void main(String[] args) 
	{
		method();
	}

	public static void method( ) {
		throw new NullPointerException();
	}
}

但是,如果我们使用throw语句抛出受检异常,则必须在catch块**中处理该异常,或者必须使用throws声明显式地声明该方法。 例如,FileNotFoundException是受检异常。

public class JavaExample 
{
	public static void main(String[] args) 
	{
		try 
		{
			method();
		} 
		catch (FileNotFoundException e) 
		{
			e.printStackTrace();
		}
	}

	public static void method( ) throws FileNotFoundException 
	{
		throw new FileNotFoundException();
	}
}

在 Java 中,ErrorRuntimeException的每个子类都是非受检的异常。 一个受检的异常是Throwable类下的所有其他内容。

1.3 异常传播

在调用栈中,异常会在方法与方法之间传播,直到被捕获为止。 因此,如果a()调用b(),然后调用c(),又调用d(),并且如果d()抛出异常,则该异常将从d传播到cb传播到a,除非这些方法之一捕获异常。

如上所述,对异常处理程序的搜索从发生错误的方法开始,然后以与调用方法相反的顺序在调用栈中进行。

找到合适的处理程序(catch)后,运行时系统会将异常传递给处理程序。 如果未找到异常处理程序,则异常到达 JVM 的默认异常处理程序,该程序将异常详细信息打印到日志并终止应用程序。

2. Java throws关键字

Java throws关键字用于声明方法执行期间可能发生的异常列表。

2.1 语法

要声明异常列表,请使用throws关键字以及异常类名称。

public static void method( ) throws FileNotFoundException, ConnectionException {
	//code
}

2.2 可以抛出受检和非受检的异常

我们可以使用throws子句声明两种类型的异常,即受检和非受检的异常。 但是调用给定方法必须仅处理受检异常。 非受检异常的处理是可选的。

public class JavaExample 
{
	public static void main(String[] args) 
	{
		try 
		{
			//Can skip handling of NullPointerException (unchecked exception)
			method();	
		} 
		catch (FileNotFoundException e) 
		{
			e.printStackTrace();
		}
	}

	public static void method( ) throws NullPointerException, FileNotFoundException {
		//code
	}
}

3. Java 中throwthrows之间的区别

  1. throw关键字用于从任何方法或构造器中显式抛出单个异常,而throws关键字用于方法和构造器声明中,表示该方法可能引发该异常。
  2. throw后跟异常类的实例,而throws后跟异常类的名称。
  3. throw用于方法和构造器,其中throws与方法和构造器签名一起使用。
  4. 我们可以使用throw仅抛出单个异常,但是可以使用throws声明多个异常,其中之一可以通过方法抛出也可以不通过方法抛出。
  5. 受检的异常将传播到调用方方法,而非受检的异常将不会传播,因此可能不需要显式的异常处理。
  6. 使用throw关键字,我们还可以中断switch语句或循环,而无需使用break关键字,使用throws无法执行它。

学习愉快!