Java教程 - Java异常语句
为了防止和处理运行时错误,请将代码包含在try块中进行监视。
紧跟在try块之后,包括一个catch子句它指定您希望捕获的异常类型。
Java try catch语句
public class Main { public static void main(String args[]) { try { // monitor a block of code. int d = 0; int a = 42 / d; System.out.println("This will not be printed."); } catch (ArithmeticException e) { // catch divide-by-zero error System.out.println("Division by zero."); } System.out.println("After catch statement."); } }
上面的代码生成以下结果。
多个catch子句
您可以指定两个或多个catch子句,每个捕获不同类型的异常。
当抛出异常时,将按顺序检查每个catch语句,并执行类型与异常类型匹配的第一个。
在执行一个catch语句之后,绕过其他catch语句,并在try/catch块之后继续执行。
public class Main { public static void main(String args[]) { try { int a = args.length; System.out.println("a = " + a); int b = 42 / a; int c[] = { 1 }; c[42] = 99; } catch (ArithmeticException e) { System.out.println("Divide by 0: " + e); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Array index oob: " + e); } System.out.println("After try/catch blocks."); } }
当您使用多个catch语句时,异常子类必须在它们的任何超类之前。
上面的代码生成以下结果。
嵌套try语句
try语句可以嵌套。
public class Main { public static void main(String args[]) { try { int a = args.length; int b = 42 / a; System.out.println("a = " + a); try { // nested try block if (a == 1) a = a / (a - a); // division by zero exception if (a == 2) { int c[] = { 1 }; c[4] = 9; // an out-of-bounds exception } } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Array index out-of-bounds: " + e); } } catch (ArithmeticException e) { System.out.println("Divide by 0: " + e); } } }
上面的代码生成以下结果。
Java throw语句
我们可以在异常情况下抛出异常。
语法
throw的一般形式如下所示:
throw ThrowableInstance;
这里,ThrowableInstance必须是Throwable类型的对象或Throwable的子类。
有两种方法可以获取Throwable对象:在catch子句中使用参数,或者使用new运算符创建一个。
执行流程在throw语句之后立即停止; 任何后续不执行语句。
如何使用Java throws语句?
public class Main { static void aMethod() { try { throw new NullPointerException("demo"); } catch (NullPointerException e) { System.out.println("Caught inside demoproc."); throw e; // rethrow the exception } } public static void main(String args[]) { try { aMethod(); } catch (NullPointerException e) { System.out.println("Recaught: " + e); } } }
上面的代码生成以下结果。
Java throws语句
如果一个方法想抛出一个异常,它必须指定这个行为。
这是包含throws子句的方法声明的一般形式:
type method-name(parameter-list) throws exception-list { // body of method }
exception-list是一个逗号分隔的列表,列出了方法可以抛出的异常。
public class Main { static void throwOne() throws IllegalAccessException { System.out.println("Inside throwOne."); throw new IllegalAccessException("demo"); } public static void main(String args[]) { try { throwOne(); } catch (IllegalAccessException e) { System.out.println("Caught " + e); } } }
上面的代码生成以下结果。
Java finally语句
任何代码,将被执行,不管try块放在一个 finally
阻止。
这是异常处理块的一般形式:
try { // block of code to monitor for errors } catch (ExceptionType1 exOb) { // exception handler for ExceptionType1 } catch (ExceptionType2 exOb) { // exception handler for ExceptionType2 } // ... finally { // block of code to be executed after try block ends }
finally
创建一个代码块在 try
/catch
块完成后执行。
即使没有catch语句与异常匹配, finally
块也将执行。
finally
块可用于关闭文件句柄和释放任何其他资源。finally子句是可选的。
public class Main { // Through an exception out of the method. static void methodC() { try { System.out.println("inside methodC"); throw new RuntimeException("demo"); } finally { System.out.println("methodC finally"); } } // Return from within a try block. static void methodB() { try { System.out.println("inside methodB"); return; } finally { System.out.println("methodB finally"); } } // Execute a try block normally. static void methodA() { try { System.out.println("inside methodA"); } finally { System.out.println("methodA finally"); } } public static void main(String args[]) { try { methodC(); } catch (Exception e) { System.out.println("Exception caught"); } methodB(); methodA(); } }
上面的代码生成以下结果。