实际工做中,遇到的状况不多是很是完美的。因此会碰到各类异常。java
软件程序在运行过程当中,可能遇到各类异常问题(文件格式不对,数据为空,内存过载...),称为异常,英文是:Exception程序员
异常指程序运行中出现的不期而至的各类情况:文件找不到、网络链接失败、非法参数等编程
异常发生在程序运行期间,它影响了正常的程序执行流程数组
public class Demo01 { public static void main(String[] args) { new Demo01().a();//StackOverflowError } public void a(){ b(); } public void b(){ a(); } }
要理解java异常处理是如何工做的,你须要掌握如下三种类型的异常:网络
java把异常当作对象来处理,并定义一个基类java.lang.Throwable做为全部异常的超类ide
在java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exceptionthis
Error类对象由Java虚拟机生成并抛出,大多数错误与代码编写者所执行的操做无关线程
在Exception分支中有一个重要的子类RuntimeException(运行时异常)3d
这些异常通常是由程序逻辑错误引发的,程序应该从逻辑角度尽量避免这类异常的发生指针
Error和Exception的区别:Error一般是灾难性的致命错误,是程序没法控制和处理的,当出现这些异常时,Java虚拟机(JVM)通常会终止线程;Exception一般状况下是能够被程序处理的,而且在程序中应该尽量的去处理这些异常
处理异常的结构以及在try-catch里抛出异常:(一个try能够有多个catch)
package com.exception; public class Test { public static void main(String[] args) { int a =1; int b =0; try{//try监控区域 if(b==0){//主动抛出异常 throw throws throw new ArithmeticException(); } System.out.println(a/b); }catch(ArithmeticException e){//catch里的参数是想要捕获的参数类型 System.out.println("程序出现异常,变量b不能为0"); }finally{//处理善后工做 System.out.println("finally"); } //finally 能够不要finally 假设IO、资源、关闭! try{//try监控区域 new Test().a(); }catch(Throwable e){//catch里的参数是想要捕获的参数类型 System.out.println("栈溢出"); }finally{//处理善后工做 System.out.println("finally22222"); } //假设要捕获多个异常:从小到大! try{//try监控区域 System.out.println(a/b); }catch(Error e){//catch里的参数是想要捕获的参数类型 System.out.println("Error"); }catch(Exception e){ System.out.println("Exception"); }catch(Throwable e){ System.out.println("Throwable"); }finally{//处理善后工做 System.out.println("close..."); } } public void a(){ b(); } public void b(){ a(); } }
try-catch-finally快捷键:ctrl+alt+T
package com.exception; public class Test2 { public static void main(String[] args) { int a =1; int b =0; //快捷键ctrl+alt+T try { System.out.println(a/b); } catch (Exception e) { System.exit(1); e.printStackTrace();//打印错误的栈信息 java.lang.ArithmeticException: / by zero } finally { } } }
在方法中抛出异常
package com.exception; public class Test3 { public static void main(String[] args) { try { new Test3().test(1,0); } catch (ArithmeticException e) { e.printStackTrace(); } } public void test(int a,int b) throws ArithmeticException{ if(b==0){// throw throws throw new ArithmeticException();//主动抛出异常,通常在方法中使用 } } }
使用java内置的异常类能够描述在编程时出现的大部分异常状况。除此以外,用户还能够自定义异常。用户自定义异常类,只需继承Exception类便可
在程序中使用自定义异常类,大致可分为如下几个步骤:
MyException自定义异常类
package com.exception.demo02; //自定义异常类 public class MyException extends Exception{ //双击+shift可搜索信息 //传递数字>10抛出异常 private int detatil; public MyException(int a) { this.detatil = a; } //toString:异常的打印信息 @Override public String toString() { return "MyException{" + "detatil=" + detatil + '}'; } }
Test类
package com.exception.demo02; public class Test { //可能会存在异常的方法 //两种写法 static void test1(int a){ System.out.println("传递的参数1为:"+a); if(a>10) { try { throw new MyException(a);//抛出 } catch (MyException e) { e.printStackTrace();//捕获 } } System.out.println("0k"); } static void test2(int a) throws MyException{//捕获 System.out.println("传递的参数2为:"+a); if(a>10) { throw new MyException(a);//抛出 } System.out.println("0k"); } public static void main(String[] args) { try { test1(13); } catch (Exception e) { System.out.println("MyException>="+e); } } }
结果: