本章学习内容:使用异常处理机制,对程序运行过程中出现的异常情况进行捕捉并处理.
目录
📌 Java异常概述
📌 Java异常体系结构
📌 常见的异常
📌 异常处理
📌 Java异常概述
○ 异常的概念:
• 程序在运行过程中出现的不正常情况;
例如用户输入数据有问题,读写文件时文件被强制删除了,网络传输过程中突然断网...
• 出现异常后,会导致jvm(虚拟机)停止运行,后续程序无法执行.
○ 注意:
• 异常指的并不是语法错误. (语法错误,编译不通过,不会产生字节码文件,根本不能运行)
○ 异常的抛出机制 :
java中把不同的异常用不同的类表示, 一旦发生某种异常, 就创建该异常类型的对象, 并且抛出;
然后程序员可以捕获到这个异常对象, 并处理; 如果没有捕获这个异常对象, 那么这个异常将会
导致程序终止。
○ java中默认的异常处理机制:
- 将出现的异常,按不同的类型分类,为每种异常封装了一个类来进行标识.
- 当出现某种类型的异常情况时,会抛出此类的对象,然后终止虚拟机的运行.
○ 异常信息:
• 异常的类型 (在哪种情况下出现,结合API定位) • 异常原因 • 异常位置
📌 Java异常体系结构
○ java.lang.Throwable : 异常体系的超类
○ Error 错误:
- 是虚拟机和Java代码无法解决的问题,例如虚拟机内部异常,内存不够用了.
- 堆溢出: OutOfMemoryError
- 栈溢出: StackOverflowError
○ Exception 异常:
- 这类异常时可以通过异常处理机制进行处理的一般性问题.
📌 常见的异常
ArithmeticException 算术异常
ArrayIndexOutOfBoundsException 数组索引越界
StringIndexOutOfBoundsException 字符串索引越界
ClassCastException 类型转换异常
NumberFormatException 数字格式化异常
NullPointerException 空指针异常
○ 代码演示:
public static void main(String[] args) {/* int a = 10;int b =0 ;System.out.println(a/b);System.out.println("*****"); */ //ArithmeticException 算术异常/* int[] c=new int[2];c[3] = 0; */ //ArrayIndexOutOfBoundsException 数组索引越界/* String s = "abc";s.charAt(4);*/ //StringIndexOutOfBoundsException 字符串索引越界/* Object o = new Integer(10);String so = (String) o;*/ //ClassCastException 类型转换异常/* Integer.parseInt("abc"); */ //NumberFormatException 数字格式化异常/*String ss = null;ss.length(); */ //NullPointerException 使用null中的方法称为空指针异常 }
📌 异常处理
⦁ Java中使用异常处理机制为程序提供了错误处理的能力
⦁ 在编码时,就针对可能出现问题的代码,预先编写一些处理机制,当程序运行出现异常时执行处理机制,之后继续执行后续的程序。
● Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws
○ try{...}catch(){...}
try{ 编写可能出现异常的代码 }catch(异常类型){ 处理机制 }
代码演示:
public static void main(String[] args) {int a =10;int b = 0;try{int c = a/b;}catch (ArithmeticException aindex){aindex.printStackTrace(); //打印异常信息到控制台/* 一般在开发调试阶段使用,供开发人员定位异常问题 */System.out.println("算术异常");}}
运行结果:
一个try代码块可以对应多个catch
public static void main(String[] args) {try {String s =null;s.length();int num =Integer.parseInt("1a");int[] b =new int[5];for (int i = 0; i <=b.length ; i++) {System.out.println(b[i]);}} catch (ArrayIndexOutOfBoundsException aindex) {aindex.printStackTrace();//打印异常信息System.out.println("数组索引越界,越界索引:"+aindex.getMessage());//getMessage()得到异常原因}catch (NumberFormatException nex){nex.printStackTrace();System.out.println("数字格式化异常:"+nex.getMessage());}catch (Exception e){//在具体捕获类型后catch Exception,可以捕获任意类型,但是必须放在最后面e.printStackTrace();System.out.println("系统繁忙~请稍后再试!");}System.out.println("继续执行后续程序");}
当我们不确定捕获类型时可以使用Exception, Exception可以捕获任意类型, 但是需要放在具体捕获类型后catch. 否则放到首部会覆盖其他具体的捕获类型。
○ finally{...}
finally块中的内容总是会执行的, 且只能有一个finally语句.
try{ 编写可能出现异常的代码}catch(异常类型){ 处理机制}finally{ 代码总能执行}
○ 使用finally的两种情形:
- 当catch错误, 异常没有被捕获到, 后面的代码无法执行, 但finally中的代码是可以执行的
public static void main(String[] args) {int[] a = new int[5];try {for (int i = 0; i <= a.length; i++) {System.out.println(a[i]);}}catch (NumberFormatException nex){nex.printStackTrace();System.out.println("数字格式化异常:"+nex.getMessage());}finally {System.out.println("继续执行后续程序");}}
- 确保在出现异常的情况下 依然最终把流对象关闭掉
public static void main(String[] args) throws IOException {FileInputStream inputStream =null;try{inputStream =new FileInputStream("F:/demo.txt");//文件若找不到,就会出现异常}catch (FileNotFoundException e){e.printStackTrace();System.out.println("文件找不到异常");}finally {//确保在出现异常时,仍然可以把流对象关闭掉if (inputStream!=null){inputStream.close();}}}
其余内容敬请期待...