1.程序中异常:
在程序执行过程中由于设计或设备原因导致的程序中断的异常现象叫做异常。
2.异常类型
2.1运行时异常:
运行时异常:(RuntimeException)在编译过程不会发现(没有语法错误),但
是在执行程序过程中,由于重大的 逻辑错误导致的程序中断。
所有RuntimeException的子类包括RuntimeException都属于运行时异常
常见的运行时异常
NullPointerException 空指针异常(一个对象没有初始化调用方法)
ArrayIndexOutOfBoundsException 下标越界异常
ClassCastException 类型转换异常(对象类型转换时)
NumberFormatException 数字格式异常
ArithmeticException 算术异常
2.2编译时异常
编译异常或检查异常,在程序设计过程中,编译时就会被发现,但是执行时可
能发生也可能不发生的异常,为了程序 不报错可以执行,那么这一类异常必须进行
相应的处理。 Exception的子类包括Exception,除了RuntimeExcption之外
都属于编译时异常。
2.3 Exception类:异常的父类。
Error类:错误,错误比较严重的问题,不属于异常,程序员无法处理。
StackOverflowError 、OutOfMemoryError
3.异常处理:
java的异常处理是通过5个关键字来实现的:
try: 执行可能产生异常的代码
catch: 捕获异常 ,并处理
finally: 无论是否发生异常,代码总能执行
throw: 手动抛出异常
throws: 声明方法可能要抛出的各种异常
使用try-catch块捕获异常,分为三种情况
第一种情况:正常情况
public void method(){
try
// 代码段(此处不会产生异常)
}catch(异常类型ex){
// 对异常进行处理的代码段
}
//代码段
}
第二种情况:出现异常
public void method(){
try
// 代码段 1
// 产生异常的代码段 2
// 代码段 3
}catch(异常类型ex){
// 对异常进行处理的代码段4
}
//代码段 5
}
printStackTrace():此方法用来显示异常信息。
第三种情况:异常类型不匹配
public void method(){
try
// 代码段 1
// 产生异常的代码段 2
// 代码段 3
}catch(异常类型ex){
// 对异常进行处理的代码段4
}
//代码段 5
}
注意:try-catch-finally 在try-catch块后加入finally块,finally块的主要作用释放资源。
(1)finally块是否发生异常都执行
(2)finally块不执行的唯一情况,退出java虚拟机,System.exit(); 0正常退出,非0非正常退出
4.:执行流程:
先执行try块中代码,如果try块中代码从头执行完没有异常,再执 行finally块中代码;如果try块中有一行出异常,就会根据这个异常判断与后面哪个catch后面的异常类型匹配,就执行那个catch,其他catch不执行,catch中代码执行完了,再执行finally块.finally块只有一种情况不执行,遇到退出JVM.
4.1.4:结构特点:
4.1.4.1: try-catch-finally结构中,try块有且仅有一个;catch块可以0个到多个;finally块可以有0个到1个.
4.1.4.2: try-catch-finally结构中,如果有多个catch块,catchf块中异常类型从上到下应该由小异常类型写到大异常类型.
4.1.4.3: try-catch-finally结构中,每个catch块 可以写多个异常类型,异常类型之间用|分隔,表示如果遇到其中任何一个异常类型就要执行这个catch块.
4.1.4.4: try-catch-finally结构中,try块一定会执行,catch最少执行0次,最多执行1次,finally执行0次到1次.
4.1.4.5:finally优先级高于return,程序先执行finally块再执行return.
finally遇到System.exit(0);就不执行.
eg:public static void main(String[] args) {
try {
String s1="abc";
boolean b1=s1.equals("abc");
System.out.println("b1的值为:"+b1);
//System.exit(0);//退出JVM
//return;
}catch (NullPointerException|ArithmeticException e) {
System.out.println("1出异常了");
}catch (Exception e) {
System.out.println("2出异常了");
//e.printStackTrace();打印异常信息
}finally {
System.out.println("这一个finally块");
}
}
eg:巧用try-catch 让出异常的代码回归正轨继续执行.
public static void main(String[] args) {
//声明一个变量作标记,标记出异常了
boolean flag=false;
do {
flag=false;
try {
Scanner input=new Scanner(System.in);
System.out.println("请输入一个整数:");
int num=input.nextInt();
System.out.println("你输入的整数是:"+num);
} catch (Exception e) {
flag=true;
System.out.println("你的输入有误,请重新输入!");
}
} while (flag==true);
}
4.2:抛出异常类型(throws):
4.2.1:适用场景:一般用来抛出检查异常.
作用:提醒调用者.
4.2.2:语法:访问修饰符 返回值类型 方法名(形参列表) throws 异常类型1,
异常类型2,...{
}
eg:public static void main(String[] args) throws ParseException{
//创建格式化对象
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//声明一个指定格式字符串,前提:指定格式字符串符合格式化对象的格式才能转换成功
String s2="2020-1-1 01:01:01";
//将指定格式字符串转换日期
Date d1=sdf.parse(s2);//检查异常
System.out.println("***"+d1);
}
4.3:抛出异常对象(throw):
4.3.1:适用场景:一般用来写底层代码时,提醒上层开发人员按要求使用底层方法
时用.
作用:提醒上层开发人员.
4.3.2:使用特征:throw抛出异常对象时一般情况下要与try-catch或者throws一起使用.
4.3.3:语法:throw 异常对象;
eg:public static void main(String[] args) throws Exception {
try {
String s1=null;
boolean b1=s1.equals("abc");
System.out.println("b1的值为:"+b1);
//System.exit(0);//退出JVM
//return;
}catch (Exception e) {
throw new Exception("出异常了");
}finally {
System.out.println("这一个finally块");
}
}
public static void main(String[] args){
try {
String s1=null;
boolean b1=s1.equals("abc");
System.out.println("b1的值为:"+b1);
//System.exit(0);//退出JVM
//return;
}catch (Exception e) {
try {
throw new Exception("出异常了");
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}finally {
System.out.println("这一个finally块");
}
}
5.自定义异常
5.1:适用场景:当java中异常无法满足用户需求,这时就可以根据用户的需求的自定义异常类.
5.2:自定义异常的语法:
public class 自定义异常名 extends Exception{
public 自定义异常名() {
super("异常提示语");
}
}
eg:/**
* 自定义异常类
* @author sx
* @version 2020年1月9日
*/
public class MyException extends Exception{
public MyException() {
super("出现了MyException异常");
}
}