异常指程序运行中出现的不期而至的各种状况,影响了正常的程序执行流程 :如文件找不到、网络连接失败、非法参数等。
异常:
java万物皆对象,把异常作为对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类
Error是无法预见的,而Exception是可以预见的
Error类对象由java虚拟器生成并抛出,通常是灾难性的致命错误,是程序无法控制和处理的,大多数错误与程序员所执行的操作无关,当出现这些异常时,JVM通常会关闭线程。
Exception通常情况下是可以被程序处理的,并在程序中应该尽可能去处理这些异常
RuntimeException是不检查异常,程序中可以选择捕获处理,也可以不处理,这些错误一般由程序逻辑错误引起的
堆栈溢出异常:
package com.yuanyu.exception; public class Demo01 { public static void main(String[] args) { new Demo01().a(); } public void a(){ b(); } public void b(){ a(); } }
除数为零异常:
package com.yuanyu.exception; public class Demo01 { public static void main(String[] args) { System.out.println(1/0); } }
package com.yuanyu.exception; public class Demo01 { public static void main(String[] args) { int a=0; int b=1; try { //监控区域 System.out.println(b/a); }catch (ArithmeticException e){ //捕获异常 System.out.println("程序出现异常,除数不能为0"); }finally { //善后处理 System.out.println("finally"); } } }
程序运行结果:
程序出现异常,除数不能为0
finally
finally可以省略,可用在IO、资源关闭时
catch()括号中是想要捕获的异常类型
假设要捕获多个异常,必须要从小到大 (可以存在多个catch,但是范围大的必须放在下面)
package com.yuanyu.exception; public class Demo01 { public static void main(String[] args) { try { new Demo01().a(); }catch (Error e){ System.out.println("wrong"); }catch (Exception e){ System.out.println("Exception"); }catch (Throwable e){ System.out.println("Throwable"); }finally { System.out.println("finally"); } } public void a(){b();} public void b(){a();} }
程序运行结果:
wrong
finally
IDEA try-catch快捷键:
Ctrl+Alt+T(插入代码块 )
package com.yuanyu.exception; public class Demo01 { public static void main(String[] args) { int a=1; int b=0; try { System.out.println(a/b); } catch (Exception e) { e.printStackTrace(); //打印错误栈信息 } } }
当我们知道代码可能出现异常时可以用throw关键字主动抛出:一般在方法中使用
package com.yuanyu.exception; public class Demo01 { public static void main(String[] args) { new Demo01().div(1,0); } public void div(int a,int b){ if (b==0){ throw new ArithmeticException(); //主动抛出异常 } System.out.println(a/b); } }
假设在方法中,处理不了这个异常,方法上throws抛出异常:
package com.yuanyu.exception; public class Demo01 { public static void main(String[] args) { try { new Demo01().div(1,0); } catch (ArithmeticException e) { e.printStackTrace(); } } public void div(int a,int b) throws ArithmeticException{ if (b==0){ throw new ArithmeticException(); //主动抛出异常 } } }
自定义异常常用于大型框架和开源系统的开发
使用java内置的异常类可以描述在编程时出现的大部分异常情况,此外,用户还可以自定义异常
用户自定义异常,只需要继承Exception类即可
步骤:
package com.yuanyu.exception; public class Test { static void test(int a) throws MyException { System.out.println("传递的参数为:"+a); if (a>10){ throw new MyException(a); //抛出 } System.out.println("OK"); } public static void main(String[] args) { try { test(11); } catch (MyException e) { System.out.println("MyException"+e); } } }
程序运行结果:
传递的参数为:11
MyExceptionMyException{detail=11}