体系结构:
成员方法:
代码示例:
public class ExceptionDemo02 { public static void main(String[] args) { int []arr={1,3,5}; try{ System.out.println(arr[3]); }catch (ArrayIndexOutOfBoundsException e){ //什么也没输出 System.out.println(e.getMessage()); //输出java.lang.ArrayIndexOutOfBoundsException: 3 System.out.println( e.toString()); //输出:java.lang.ArrayIndexOutOfBoundsException: 3 // at org.example.Exception.ExceptionDemo02.main(ExceptionDemo02.java:14) e.printStackTrace(); } System.out.println("程序运行结束"); } }1.Exception
Error:严重问题,不需要处理,也处理不了.
Exception:异常类,表示程序本身可以处理的问题:
- RuntimeException:运行时异常,在编译期是不检查的,出现问题后,需要检查代码,修改代码
- 非RuntimeException:编译器必须处理的,否则程序不能编译,更无法执行
JVM的默认处理方案:
如果程序出现问题,而我们又未做任何处理,JVM默认处理:
- 将异常原因以及出现的位置等信息在控制台输出;
- 程序停止运行
代码示例:
package org.example.Exception; public class ExceptionDemo01 { public static void main(String[] args) { exceptionMethod(); } public static void exceptionMethod(){ int [] arr={1,3,5}; System.out.println(arr[3]); } }
运行结果:
1.2 try…catch…处理异常try{ 可能出现异常的代码块 }catch(异常类名 变量名){ 异常处理代码 }
执行流程:
程序从try里面的代码开始执行,出现异常是,自动生成一个异常类对象,该异常类对象将被提交给java运行时系统
当java运行时系统接收到异常对象时,会到catch中去找匹配的异常类,找到后进行异常的处理;只想完毕后,程序可继续运行.
1.2.1 使用try…catch…处理示例:
package org.example.Exception; public class ExceptionDemo02 { public static void main(String[] args) { int []arr={1,3,5}; try{ System.out.println(arr[3]); }catch (ArrayIndexOutOfBoundsException e){ e.printStackTrace(); } System.out.println("程序运行结束"); } }
运行结果:
1.2.2不使用try…catch:package org.example.Exception; public class ExceptionDemo02 { public static void main(String[] args) { int []arr={1,3,5}; System.out.println(arr[3]); System.out.println("程序运行结束"); } }
运行结果:
可以看到"程序运行结束"并没有在控制台输出
1.2.3 catch中设置的异常与抛出的异常不匹配代码示例:
package org.example.Exception; import java.io.FileNotFoundException; public class ExceptionDemo02 { public static void main(String[] args) { int []arr={1,3,5}; try{ System.out.println(arr[3]); }catch (ArrayStoreException e){ e.printStackTrace(); } System.out.println("程序运行结束"); } }
抛出的异常应该为java.lang.ArrayIndexOutOfBoundsException,但是我设置要捕获的异常为ArrayStoreException ,结果如何?
实际运行结果:
没捕获到对应类型的异常,按照默认情况处理.
1.3 thows异常处理异常处理也可以使用throws.
格式:throws 异常类名
是附加在方法括号后,方法体"{"前
然而说是处理异常,其实就是将异常抛给调用者,谁调用谁处理,可以层层往上抛(真会甩锅)
注意:
- 编译时异常必需要进行处理,可try…catch…也可throws
- 运行时异常可以不处理,也处理不了
格式:
public class 自定义异常类名 extends Exception{ 无参构造; 有参构造; }
示例:
package org.example.Exception; public class UnknownException extends Exception{ public UnknownException() { } public UnknownException(String message) { super(message); } }
package org.example.Exception; public class ExceptionDemo03 { public static void main(String[] args) { try { method(); }catch (UnknownException e){ e.printStackTrace(); } } public static void method() throws UnknownException { int []arr={1,3,5}; try{ System.out.println(arr[3]); }catch (ArrayIndexOutOfBoundsException e){ throw new UnknownException("俺也不知道出现了啥问题,程序就是不动"); } } }
运行结果:
**
**
编译时异常与运行时异常区别
Java中异常分为两大类:编译时异常(受检异常)和运行时异常(非受检异常).所有的RuntimeException类及其子类被称为运行时异常,其他的异常都是编译时异常
- 编译时异常:必需显式处理,否则直接报错,无法编译
- 运行时异常:无需显式处理,也可和编译时异常一样处理
throws和throw区别
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)