本章学习内容:使用异常处理机制,对程序运行过程中出现的异常情况进行捕捉并处理.
目录
📌 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();
}
}
}
其余内容敬请期待...