一、 本章内容介绍
异常的概念
异常体系图(!!)
常见的异常
异常处理的概念
异常处理的分类
自定义异常
throw和throws的对比
1.异常介绍
1.1.1 基本概念
Java语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常)
1.1.2 执行过程中所发生的异常事件可分为两类
1) Error(错误): Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowError【栈溢出】和OOM(out of memory),Error 是严重错误,程序会崩溃。
2) Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如空指针访问,试图读取不存在的文件,网络连接中断等等,Exception 分为两大类:运行时异常(程序运行过程中发生)和编译时异常(编译过程中发生)。
图1.
说明
1) Error 和 Exception 都是Throwable的子类.
2) 所有的Error 和 Exception 实现了Serializable 接口(简单说明:如果一个类实现了Serializable 接口,那么这个类的对象,就可以直接存放到磁盘(String) , 或者该对象可以在网络上传输. )
图2.
说明:
1) Throwable 下有个两个重要的子类,Error, Exception
2) Exception 分为 编译异常和运行异常.
3) 编译异常的直接父类就是Exception
4) 运行异常的直接父类时RuntimeException
5) 编译异常 称为受检异常,必须处理,否则编译不能通过, 常见的有IOExcepton(文件操作),SQLException(数据库操作)
6) 运行异常, 可以不捕获,编译可以通过,并且可以运行,但是一旦发生了运行异常(又没有处理),则程序崩溃。常见的有: NullPointerException, ArrayIndexOutofBoundsExceptino(数组越界异常), ArithmeticException(算术异常),ClassCastException(类型转换异常)
2.常见的运行时异常
1.1.1 常见的运行时异常包括
1) NullPointerException空指针异常
2) ArithmeticException数学运算异常
3) ArrayIndexOutOfBoundsException数组下标越界异常
4) ClassCastException类型转换异常
5) NumberFormatException数字格式不正确异常
1.1.2 常见的运行时异常举例
1)NullPointerException空指针异常
当应用程序试图在需要对象的地方使用 null 时,抛出该异常,看案例演示
2)ArithmeticException数学运算异常
当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例, 案例演示
3)ArrayIndexOutOfBoundsException数组下标越界异常
用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引
4)ClassCastException类型转换异常
当试图将对象强制转换为不是实例的子类时,抛出该异常。例如,以下代码将生成一个 ClassCastException
5)NumberFormatException数字格式不正确异常
当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常
null调方法就出错了
3.编译异常
4.异常处理的两种方式
- try-catch-finally
程序员在代码中捕获发生的异常,自行处理
- throws
将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM
5. try-catch异常处理
1.1.1 try-catch方式处理异常说明
1) Java提供try和catch块来处理异常。try块用于包含可能出错的代码。catch块用于处理try块中发生的异常。可以根据需要在程序中有任意数量的try...catch块。
2) 基本语法
try {
//可疑代码
}catch(异常){
//对异常的处理
6.try-catch方式处理异常-注意事项
7.try-catch案例
output定义成静态的了
1.1.1 try-catch-finally执行顺序小结
1) 如果没有出现异常,则执行try块中所有语句,不执行catch块中语句,如果有finally,最后还需要执行finally里面的语句
2) 如果出现异常,则try块中剩下的语句不再执行。将执行catch块中的语句,如果有finally,最后还需要执行finally里面的语句 !
8. throws异常处理
9.throws 注意事项和使用细节
10.自定义异常
1.1.1 基本概念
当程序中出现了某些“错误”,但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息。
1.1.2 自定义异常的步骤
1) 定义类:MyException 继承Exception或RuntimeException
2) 如果继承Exception,属于编译异常
3) 如果继承RuntimeException,属于运行异常
1 public class CustomExceptionDemo1 { 2 3 public static void main(String[] args) { 4 // TODO Auto-generated method stub 5 6 try { 7 test((short)-10); 8 } catch (Exception e) { 9 // TODO Auto-generated catch block 10 System.out.println(e.getMessage()); //年龄应当在 0~130之间 11 } 12 13 } 14 15 public static void test(short age) { 16 17 if(age <=0 || age > 130) { 18 throw new AgeException("年龄应当在 0~130之间"); 19 } 20 System.out.println("年龄正确=" + age); 21 } 22 23 } 24 25 //当我们接收Person对象年龄时,要求范围在 1 – 130 之间, 26 //否则抛出一个自定义异常,并给出提示信息。 27 28 @SuppressWarnings("serial") 29 class AgeException extends RuntimeException { 30 //属性.. 31 32 /** 33 * 34 */ 35 //private static final long serialVersionUID = -6192167482292785331L; 36 37 public AgeException() { 38 // TODO Auto-generated constructor stub 39 } 40 41 public AgeException(String mes){ 42 super(mes); //将信息给属性. 43 } 44 }
11.自定义异常应用实例
1 public class Exam01 { 2 3 public static void main(String[] args) { 4 5 // TODO Auto-generated method stub 6 try { 7 String name = "john~"; 8 String password = "1000"; 9 if (!"john".equals(name)) { 10 throw new UserNameException("用户名不正确~"); 11 } else if (!"000".equals(password)) { 12 throw new PassWordException("密码不正确~~"); 13 } else { 14 System.out.println("恭喜, 登录成功~"); 15 } 16 } catch (Exception e) { 17 // if (e instanceof UserNameException) { 18 // System.out.println("捕获到 UserNameException"); 19 // } 20 // TODO Auto-generated catch block 21 System.out.println(e.getMessage()); 22 } 23 24 25 26 } 27 28 } 29 30 /* 31 * 自定义异常的应用实例3 32 33 编实现登录验证 34 控制台输入用户名 和密码 ,判断是否 为 "john" 和 "000" 35 如果用户名输入错误,生成错误信息为“用户名不存在”的异常对象 36 如果用户名正确,密码输入错误,生成错误信息为“密码不正确”的异常对象 37 如果用户名和密码都正确,则输出 "恭喜, 登录成功~" 38 */ 39 40 @SuppressWarnings("serial") 41 class UserNameException extends RuntimeException { 42 public UserNameException(String mes) { 43 super(mes); 44 } 45 public UserNameException() { 46 super(); 47 } 48 49 } 50 51 @SuppressWarnings("serial") 52 class PassWordException extends RuntimeException { 53 public PassWordException(String mes) { 54 super(mes); 55 } 56 public PassWordException() { 57 super(); 58 } 59 60 }
12.throw 和 throws 的区别
最后再抛