Java try-catch示例

时间:2020-02-23 14:36:59  来源:igfitidea点击:
  • Java try-catch块用于处理程序中的异常。

  • 执行try块中的代码,如果发生任何异常,则使用catch块对其进行处理。

  • 如果catch块无法处理该异常,则将其返回给调用程序。

  • 如果程序无法处理异常,则将其返回到JVM,JVM终止该程序并将异常堆栈跟踪打印到输出流。

  • 尝试块之后必须是catch或者finally块。

Java try-catch示例

让我们看一个简单的代码,从中可以得到一个例外。

package com.theitroad.examples;

public class JavaTryCatch {

	public static void main(String[] args) {
		System.out.println(divide(20,5));
		System.out.println(divide(20,0));
	}
	
	public static double divide(int x, int y) {
		return x/y;
	}

}

输出:

4.0
Exception in thread "main" java.lang.ArithmeticException:/by zero
	at com.theitroad.examples.JavaTryCatch.divide(JavaTryCatch.java:11)
	at com.theitroad.examples.JavaTryCatch.main(JavaTryCatch.java:7)

现在,让我们看看如何使用try-catch块来处理divide()方法引发的异常。

package com.theitroad.examples;

public class JavaTryCatch {

	public static void main(String[] args) {
		try {
			System.out.println(divide(20, 5));
			System.out.println(divide(20, 0));
		} catch (ArithmeticException ae) {
			System.out.println(ae.getMessage());
		}
	}

	public static double divide(int x, int y) {
		return x/y;
	}

}

输出:

4.0
/by zero

Java try-catch多个异常

我们可以在一系列catch块中捕获多个异常。
让我们看一个使用多个捕获块的简单示例。

package com.theitroad.examples;

public class JavaTryCatch {

	public static void main(String[] args) {

		try {
			foo(10);
		} catch (IllegalArgumentException ie) {
			System.out.println(ie.getMessage());
		} catch (NullPointerException ne) {
			System.out.println(ne.getMessage());
		}
	}

	public static void foo(int x) throws IllegalArgumentException, NullPointerException {
		//some code
	}

}

捕获例外命令

Java异常具有层次结构。
Throwable是所有异常和错误的超类。
捕获多个异常时,应首先捕获最具体的异常。
否则,将引发编译时错误,并显示消息" Unreachable catch block。
它已由catch块处理为"例外"。

下面的代码将给出编译时错误,因为NullPointerException应该在Exception之前捕获。

try {
	foo(10);
} catch (Exception ie) {
	System.out.println(ie.getMessage());
} catch (NullPointerException ne) {
	System.out.println(ne.getMessage());
}

在单个catch块中捕获多个异常

如果您注意到上面的代码,我们将在所有catch块中打印异常消息。
Java支持在单个catch块中捕获多个异常。
Java 7中引入了此功能。

try {
	foo(10);
} catch (IllegalArgumentException | NullPointerException e) {
	System.out.println(e.getMessage());
}

Java try-catch-finally示例

即使程序引发异常并终止,finally块也始终执行。
通常使用finally块来确保在程序终止之前关闭资源。

这是try-catch-finally块的真实示例。
我们正在尝试打开文件并对其进行处理。
我们正在使用finally块来确保FileInputStream已关闭。

package com.theitroad.examples;

import java.io.FileInputStream;
import java.io.IOException;

public class JavaTryCatch {

	public static void main(String[] args) {
		FileInputStream fis = null;
		try {
			fis = new FileInputStream("data.txt");
			//code to process the file
			fis.close();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (fis != null)
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}

	}

}

不推荐使用Java finally块,因为它不可靠。
推荐的方法是使用try-with-resources自动初始化和关闭资源。