异常
一、异常、错误概念:
异常:(Exception)程序本身可以克服和恢复的问题,遇到异常建议捕获处理异常,是程序基础正常执行,如:空指针异常、算数异常、下标越界异常等等,异常并不是代码语法错误。
错误:(Error)不能处理的问题,程序本身无法克服和恢复的严重问题,遇到错误,建议终止程序执行,如:栈溢出错误等等。
异常处理的好处:
提高代码容错性和健壮性;
将业务功能代码和异常处理代码分离。
二、异常体系:
- 父类:Throwable(lang)
- 子类:Error 和 Exception
- Exception分为 运行时异常 和 检查异常 。
- 运行时异常 : RunTimeException 和 该类的所有子类
- 检查异常 : 运行时异常之外,其他的异常。
三、十个异常:
- classCastException--------------------------------------类型转换异常
- nullPointerException------------------------------------空指针异常
- dateTimeException--------------------------------------日期时间异常
- IndexOutOfBoundsException------------------------数组下标越界异常
- ArithmeticException-------------------------------------算数错误异常
- InputMismatchException------------------------------输入不匹配异常
- SQLException-----------------------------------------------数据库异常
- IOException-------------------------------------------------IO流异常
- FileNotFoundException---------------------------------文件未找到异常
- FileAlreadyExistsException-----------------------------可选特定的异常
四、异常处理机制:
try{ 业务功能代码 }catch(异常类名 变量名){ 异常处理代码 }catch(异常类名 变量名){ 异常处理代码 } ....... finally{ 异常处理代码 }
- 把可能出现异常的代码放在try中;
- catch和finally可以只有其中一个;
- finally中的代码一定会执行。
五、异常处理逻辑
- 业务功能代码没有抛出异常,执行finally中的代码,程序接着向下正常执行;
- 业务功能代码抛出异常,try块中抛出异常语句后面的语句不会执行,将抛出的异常类对象依次和catch后面的异常类进行对比,如异常类对象 instanceOf 异常类名 为真,则被该catch捕获,执行该catch后的异常处理代码,再执行finally中的代码,程序接着向下正常执行。
- 业务功能代码抛出异常,没有被后面的catch捕获,执行finally中的代码,系统将该异常类对象向上抛出。抛给了调用该方法的方法。
六、注意事项:
- Exception一定要放在最后一个catch中判断;
- 在try或catch中执行return语句时,在将栈中的地址弹出并返回前会执行finally 中的代码。
public class Exception01 { static void f() { try { Scanner scanner = new Scanner(System.in); int a, b; System.out.println("请输入两个整数:"); a = scanner.nextInt(); b = scanner.nextInt(); System.out.println(a / b); System.out.println("==="); } catch (ArithmeticException e) { System.out.println("捕获算数异常"); } catch (Exception e) { System.out.println("捕获异常"); } finally { System.out.println("一定执行"); } System.out.println("f执行完毕"); } static int g() { int a = 1; try { a = 2 / 0; return a; //1、将a的表达式的值放在了可以被main方法和g方法都能访问的空间中; //2、执行finally语句 //3、从栈中弹出返回的地址,跳转到该地址执行 } catch (Exception e) { return a; } finally { a = 3; return a; } } public static void main(String[] args) { try { f(); } catch (InputMismatchException e) { System.out.println("捕获输入格式不匹配异常"); } System.out.println("++++++"); int t = g(); System.out.println(t); } }
七、异常类中常用方法:
- Exception(String massage):
- String getMessage():
- void printStackTrace()://打印栈轨迹
public class Exception02 { static void f1(){ System.out.println("进入f1"); f2(); System.out.println("退出f1"); } static void f2(){ System.out.println("进入f2"); f3(); System.out.println("退出f2"); } static void f3(){ System.out.println("进入f3"); f4(); System.out.println("退出f3"); } static void f4(){ System.out.println("进入f4"); System.out.println(3 / 0); System.out.println("退出f4"); } public static void main(String[] args) { Exception exception = new Exception("你好"); String message = exception.getMessage(); System.out.println(message); try{ f1(); }catch (Exception e){ System.out.println("*****************"); exception.printStackTrace(); //创建了线程,在新的线程中打印栈轨迹 } System.out.println("------------------"); } }
八、自定义异常:
- 继承Exception,通常是 RuntimeException
- 可以在自定义异常的构造方法中来调用super(message)来设置和提高getMessage获取消息
九、throw和throws的区别:
throw:
- throw语句用在方法体内,表示抛出异常,由方法体内的语句处理;
- throw是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行throw一定是抛出某种异常。
throws:
- throws语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常处理;
- throws主要是声明这个方法会抛出某种异常,让他的使用者要知道需要捕获的异常的类型;
- throws表示出现异常的一种可能型,并不一定会发生这种异常
本文来自博客园,作者:LXXXXxZz,转载请注明原文链接:https://www.cnblogs.com/l11111/p/16593239.html