本文详细介绍了Java中的异常处理机制,包括异常的概念、Java异常体系结构(如Throwable、Error和Exception),以及常见的算术异常、数组越界等,并通过示例展示了try-catch-finally语句的使用和finally块的作用。
📌 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(); } } }
其余内容敬请期待...