异常处理机制
java中的异常处理机制使得即使程序出现异常,代码也能够继续执行下去而不是直接退出程序。下面我们先来简单的了解一下异常处理是怎么使用。
在引用异常处理之前,代码运行中存在异常会导致JVM直接中断该程序并输出异常信息,如下:
public class ExceptionTry { public static void main(String[] args) { int i = 0; System.out.println(9 / i); System.out.println("程序继续执行"); } }
而在使用异常处理机制之后,我们可以对异常进行简单的处理,应用场景有很多,假如淘宝商品的筛选中价格筛选区间实现是使用如下的代码(目前学习还不够深入,淘宝具体功能的实现可能不是这么简单,只是我是这么理解的):
Scanner scanner = new Scanner(System.in);
double a = scanner.nextDouble();
假如用户玩心大起,或者输入时有误触,输入字符串,这会产生InputMismatchException异常,也就是输入类型无法转换为double型,数据输入类型不匹配,从而导致程序直接中断退出,用户再次使用就只能重新启动,极度影响软件的使用体验。同时,在debug代码中也会带来许多不必要的麻烦。这个时候使用异常处理可以很好的优化使用体验,同时极大的提高了代码的健壮性。还是使用第一个例子:
public class ExceptionTry { public static void main(String[] args) { try { int i = 0; System.out.println(9 / i); } catch (Exception e) { System.out.println("代码出现异常:" + e.getMessage()); } System.out.println("程序继续执行"); } }
这个时候代码是正常运行结束的:
异常和错误的区分
异常(Exception)和错误(Error)是两个完全不同的概念,在我的理解中前者是代码在偶然性或者编程错误等因素导致的一般性问题,可以使用针对性的代码来进行处理的,比如空指针使用异常,算数错误异常(除零,开负数根等等),类型转换错误,数组越界等等;而错误则是更加严重的JVM系统内部错误或者资源耗尽导致程序完全不能执行,比如栈溢出,内存不足等等。通俗来讲就是前者是肚子疼,后者是癌症。
异常中又可以细分为运行时异常和编译时异常,前者是编译器无法检查出的逻辑错误,如上面那个例子中的by zero的除零错误就是运行时异常,而后者是编译器要求必须处理的异常,不然编译过不了,比如在开文件流的时候使用空文件出现的FileNotFundException。
try-catch-finally的使用
try-catch-finally语法了解
了解了异常处理机制的作用接下来我们可以来先看看这个语句是怎么使用的
整体上是很好理解的,try后面的代码是我们认为的可能出现异常的代码,在这个代码块中如果出现异常,JVM就会把出现的异常捕获到catch模块中,然后我们可以在其中进行针对性的操作,比如还是第一个例子,我们可以在catch中输出报错然后要求进行重新输入:
public class ExceptionTry { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int i = 0; try { System.out.println(9 / i); } catch (Exception e) { System.out.println("代码出现异常:" + e.getMessage()); System.out.println("请重新输入i"); i = scanner.nextInt(); } System.out.println("程序继续执行"); } }