4.4
4.4.1 了解异常
异常
异常定义了程序中遇到的非致命的错误, 而不是编译时的语法错误, 异常定义了程序中遇到的非致命的错误, 而不是编译时的语法错误,如程序要打开一个 不存的文件、网络连接中断、操作数越界、装载一个不存在的类等。 不存的文件、
网络连接中断、操作数越界、装载一个不存在的类等。 我们先来看看下面的程序代码吧: 我们先来看看下面的程序代码吧:
public class TestException { public static void main(String [] args) { int result = new Test().devide( 3, 0 ); System.out.println(“the result is” + result ); } } class Test { public int devide(int x, int y) { int result = x/y; return result; } }
编译运行上面的程序, 编译运行上面的程序,将出现如下错误:
Exception in thread "main" java.lang.ArithmeticException: / by zero at Test.devide(TestException.java:14) at TestException.main(TestException.java:5)
上面的程序运行的结果报告发生了算术异常(ArithMethicException),系统不再执行 上面的程序运行的结果
报告发生了算术异常(ArithMethicException),系统不再执行 ), 下去,提前结束,这种情况就是我们所说的异常。 下去,提前结束,这种情况就是我们所说的异常。
4.4.2 try… catch 语句
我们将上面的程序代码进行如下修改: 我们将上面的程序代码进行如下修改:
public class TestException { public static void main(String [] args) { try { int reslut = new Test().devide( 3, 0 ); System.out.println("the result is" + reslut ); } catch(Exception e) {
System.out.println(e.getMessage()); } System.out.println("program is running here ,that is normal !"); } } class Test { public int devide(int x, int y) { int result = x/y; return result; } }
程序运行结果如下: 程序运行结果如下: / by zero program is running here ,that is normal ! 我们看到程序在出现异常后,系统能够正常的继续运行,而没有异常终止。 我们看到程序在出现异常后,系统能够正常的继续运行,而没有异常终止。在上面的 程序代码中, try… 语句进行了处理, 程序代码中,我们对可能会出现错误的代码用 try…catch 语句进行了处理,当 try 代码块 中的语句发生了异常, 代码块中执行, 中的语句发生了异常,程序就会跳转到 catch 代码块中执行,执行完 catch 代码块中的程 序代码后, 代码块后的其他代码, 序代码后,
系统会继续执行 catch 代码块后的其他代码,但不会执行 try 代码块中发生异 常语句后的代码, System.out.println( tln(“the is” 常语句后的代码,如程序中的 System.out.println( the result is + result ); 不会 再被执行。 的异常处理是结构化的,不会因为一个异常影响整个程序的执行。 再被执行。可见 Java 的异常处理是结构化的,不
会因为一个异常影响整个程序的执行。 代码块中的程序发生了异常,系统将这个异常发生的代码行号, 当 try 代码块中的程序发生了异常,系统将这个异常发生的代码行号,类别等信息封 装到一个对象中, 代码块, 装到一个对象中,并将这个对象传递给 catch 代码块,所以我们看到 catch 代码块是以下 面的格式出现的。 面的格式出现的。
catch(Exception e) { System.out.println(e.getMessage()); }
catch 关键字后跟有一个用括号括起来的 Exception 类型的参数 e,这跟我们经
常用到 的如何定义一个函数接收的参数格式是一样的。 的如何定义一个函数接收的参数格式是一样的。括号中的 Exception 就是 try 代码块传递 代码块的变量类型, 就是变量名, 改用成别的名称( 给 catch 代码块的变量类型, 就是变量名, e 所以我们也可以将 e 改用成别的名称(如 ex 等), 如下所示: 如下所示:
catch(Exception ex) { System.out.println(ex.getMessage())