Java的try块用于封装可能会抛出异常的代码。它必须在方法内部使用。
如果在try块中的特定语句处发生异常,后续的代码块将不会执行。因此,建议不要在try块中放置不会抛出异常的代码。
Java的try块必须后跟catch块或finally块。
Java try-catch语法
try{
//可能引发异常的代码
}catch(Exception_class_Name ref){}
Java try-finally块的语法
try{
//可能引发异常的代码
}finally{}
Java catch块
Java的catch块用于通过在参数中声明异常类型来处理异常。声明的异常类型必须是父类异常(即Exception)或生成的异常类型。然而,良好的做法是声明生成的异常类型。
catch块必须在try块之后使用。可以在单个try块中使用多个catch块。
Java try-catch块的内部工作原理
JVM首先检查异常是否被处理。如果异常未被处理,JVM提供默认的异常处理程序,执行以下任务:
-
打印异常描述。
-
打印堆栈跟踪(异常发生的方法层次结构)。
-
导致程序终止。
但是,如果应用程序程序员处理了异常,将保持应用程序的正常流程,即执行其余的代码。
没有异常处理的问题
让我们尝试理解如果我们不使用try-catch块会出现什么问题。
示例1
TryCatchExample1.java
public class TryCatchExample1 {
public static void main(String[] args) {
int data=50/0; //可能会抛出异常
System.out.println("rest of the code");
}
}
输出:
Exception in thread "main" java.lang.ArithmeticException: / by zero
如上例所示,未执行后续的代码(在这种情况下,未打印后续的代码语句)。
如果异常没有被处理,异常下面的所有代码都不会被执行。
通过异常处理的解决方案
让我们通过Java的try-catch块来解决上述问题。
示例2
TryCatchExample2.java
public class TryCatchExample2 {
public static void main(String[] args) {
try
{
int data=50/0; //可能会抛出异常
}
//处理异常
catch(ArithmeticException e)
{
System.out.println(e);
}
System.out.println("rest of the code");
}
}
输出:
java.lang.ArithmeticException: / by zero
rest of the code
如上例所示,执行了后续的代码,即打印了后续的代码语句。
示例3
在这个示例中,我们还将不会抛出异常的代码放在了try块中
TryCatchExample3.java
public class TryCatchExample3 {
public static void main(String[] args) {
try
{
int data=50/0; //可能会抛出异常
// 如果发生异常,其余语句将不会执行
System.out.println("rest of the code");
}
// 处理异常
catch(ArithmeticException e)
{
System.out.println(e);
}
}
}
输出:
java.lang.ArithmeticException: / by zero
在上述示例中,我们可以看到如果在try块中发生异常,后续的代码块将不会执行。
示例4
在这个示例中,我们使用父类异常来处理异常。
TryCatchExample4.java
public class TryCatchExample4 {
public static void main(String[] args) {
try
{
int data=50/0; //可能会抛出异常
}
// 使用异常类处理异常
catch(Exception e)
{
System.out.println(e);
}
System.out.println("rest of the code");
}
}
输出:
java.lang.ArithmeticException: / by zero
rest of the code
示例5
让我们看一个在异常上打印自定义消息的示例。
TryCatchExample5.java
public class TryCatchExample5 {
public static void main(String[] args) {
try
{
int data=50/0; //可能会抛出异常
}
//处理异常
catch(Exception e)
{
// 显示自定义消息
System.out.println("Can't divided by zero");
}
}
}
输出:
Can't divided by zero
示例6
让我们看一个在catch块中解决异常的示例。
TryCatchExample6.java
public class TryCatchExample6 {
public static void main(String[] args) {
int i=50;
int j=0;
int data;
try
{
data=i/j; //可能会抛出异常
}
// 处理异常
catch(Exception e)
{
// 解决 catch 块中的异常
System.out.println(i/(j+2));
}
}
}
输出:
25
示例7
在这个示例中,除了try块,我们还将异常代码放在了catch块中
TryCatchExample7.java
public class TryCatchExample7 {
public static void main(String[] args) {
try
{
int data1=50/0; //可能会抛出异常
}
//处理异常
catch(Exception e)
{
// 在 catch 块中生成异常
int data2=50/0; //可能会抛出异常
}
System.out.println("rest of the code");
}
}
输出:
Exception in thread "main" java.lang.ArithmeticException: / by zero
在这里,我们可以看到catch块中没有包含异常代码。因此,在try块中包含异常代码,并且仅在catch块中处理异常。
示例8
在这个示例中,我们使用不同类型的异常类(ArrayIndexOutOfBoundsException)处理生成的异常(Arithmetic Exception)。
TryCatchExample8.java
public class TryCatchExample8 {
public static void main(String[] args) {
try
{
int data=50/0; //可能会抛出异常
}
// 尝试使用 ArrayIndexOutOfBoundsException 处理 ArithmeticException
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println(e);
}
System.out.println("rest of the code");
}
}
输出:
Exception in thread "main" java.lang.ArithmeticException: / by zero
示例9
让我们看一个处理另一个未检查异常的示例。
TryCatchExample9.java
public class TryCatchExample9 {
public static void main(String[] args) {
try
{
int arr[]= {1,3,5,7};
System.out.println(arr[10]); //可能会抛出异常
}
// 处理数组异常
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println(e);
}
System.out.println("rest of the code");
}
}
输出:
java.lang.ArrayIndexOutOfBoundsException: 10
rest of the code
示例10
让我们看一个处理已检查异常的示例。
TryCatchExample10.java
import java.io.FileNotFoundException;
import java.io.PrintWriter;
public class TryCatchExample10 {
public static void main(String[] args) {
PrintWriter pw;
try {
pw = new PrintWriter("jtp.txt"); //可能会抛出异常
pw.println("saved");
}
// 提供已检查的异常处理程序
catch (FileNotFoundException e) {
System.out.println(e);
}
System.out.println("File saved successfully");
}
}
输出:
File saved successfully