java语言中的异常的定义及使用

java语言中的异常的定义及使用


(一)概念:

程序在运行过程中出现的特殊情况。


(二)异常的必要性:

任何程序都可能存在大量的未知问题、错误。
如果不对这些问题进行正确处理,则可能导致程序的中断,造成不必要的损失。


(三)异常的分类:

(1)运行时异常(非受检性异常),可处理,可不处理:
  编译器不要求我们处理的异常,只有在运行的时候才会发生的异常,主要原因是编写程序的时候不够严谨,是需要避免的异常。
(2)检查时异常(受检性异常),必须处理:
  1)抛出异常类型:throws
    不知道如何处理异常的情况,把异常抛出,交由调用方处理,一旦出现异常,会终止程序。
  2)捕获异常
    在内部把异常处理,无需调用方处理,不管有没有发生异常程序照常运行。
  3)抛出异常对象:throw
    指定异常对象抛出,也会终止程序。

(四)常见的运行时异常:

异常描述
NullPointerException空指针异常
ArrayIndexOutOfBoundsException数组越界异常
ClassCastException类型转换异常
NumberFormatException数字格式化异常
ArithmeticException算术异常
1)空指针异常
String str = null;
System.out.println(str.equals(""));
2)数组越界异常
int[] nums = new int[3];
nums[3] = 10;
3)类型转换异常
Object x = new String("String");
System.out.println((Integer) x);
4)数字格式化异常
int num = Integer.parseInt("index");
System.out.println(num);
5)算术异常
int num = 10 / 0;
System.out.println(num);

(五)异常的处理:

Java的异常处理是通过5个关键字来实现的:
1)try:执行可能产生异常的代码 。
2)catch:捕获异常 ,并处理。
3)finally:无论是否发生异常,代码总能执行。
4)throws:声明方法可能要抛出的各种异常。
5)throw: 手动抛出异常 。
(1)try…catch…

语法:
try {
//可能出现异常的代码
} catch(Exception e) {
//异常处理的相关代码,如:getMessage()、printStackTrace()
}

public class Main {
    public static void main(String[] args){
        try {
        	//一旦异常被引发,程序控制由try块转到catch块
            int a = 10 / 0;
            //所以这句话是永远不会执行的
            System.out.println("a的结果:" + a);
        } catch (ArithmeticException e) {
            System.out.println("算术异常!");
        }
        System.out.println("程序结束!");
    }
}
//输出结果:
//算术异常!
//程序结束!
(2)try…catch…finally…

语法:
try {
//可能出现异常的代码
} catch(Exception e) {
​ //异常处理的相关代码,如:getMessage()、printStackTrace()
} finally{
//是否发生异常都会执行,可以释放资源等。
}

public class Main {
    public static void main(String[] args){
        try {
            int a = 10 / 0;
            System.out.println("a的结果:" + a);
        } catch (ArithmeticException e) {
            System.out.println("算术异常!");
        } finally {
            System.out.println("有异常!");
        }
        System.out.println("程序结束!");
    }
}
//输出结果:
//算术异常!
//有异常!
//程序结束!
public class Demo03 {
    public static void main(String[] args) {
        System.out.println(test());
    }

    public static int test(){
        try{
            //终止虚拟机
            System.exit(1);
            return 1;
        }finally {
            //return 2;
            System.out.println("要return啦");
        }
    }
}
//只有这种情况不会执行finally

注:
  1、finally块是否发生异常都执行;
  2、finally块不执行的唯一情况是退出java虚拟机。

(3)多重catch

语法:
try{
​ //可能出现异常的代码。
}catch(异常类型1){
​ //满足异常类型1执行的相关代码。
}catch(异常类型2){
​ //满足异常类型2执行的相关代码。
}catch(异常类型3){
​ //满足异常类型3执行的相关代码
}

public class Main {
    public static void main(String[] args){
        try {
            int a = 10 / 0;
            System.out.println("a的结果:" + a);
        } catch (ArithmeticException e) {
            System.out.println("算术异常!");
        } catch (Exception e) {
            System.out.println("未知异常!");
        }
        System.out.println("程序结束!");
    }
}

注:
  1、遵循从子( 小 )到父( 大 )的顺序,子类异常在前,父类异常在后;
  2、发生异常时按顺序逐个匹配;
  3、只执行第一个与异常类型匹配的catch语句。

(4)try…finally…
  • try…finally…不能捕获异常 ,仅仅用来当发生异常时,用来释放资源。
  • 一般用在底层代码,只释放资源不做异常处理,把异常向上抛出。

语法:
try{
//可能出现异常的代码
}finally{
//是否发生异常都会执行,可以释放资源等
}

public class Main {
    public static void main(String[] args) {
        try {
            divide();
        } catch (Exception e) {
            System.out.println("出现异常:"+e.getMessage());
        }
    }
    public static void divide() {
        try {
            int a = 10/0;
            System.out.println("a的结果:" + a);
        } finally {
            System.out.println("释放资源!");
        }
        System.out.println("程序结束!");
    }
}
(5)声明异常:throws
public class Main {
    public static void main(String[] args) {
        try {
            divide();
        }catch (Exception e) {
            System.out.println("出现异常:"+e.getMessage());
        }
    }
    public static void divide() throws Exception {
        int a = 10/0;
        System.out.println("a的结果:" + a);
    }
}
(6)抛出异常:throw
public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入姓名:");
        person.setName(sc.next());
        System.out.println("请输入性别:");
        person.setSex(sc.next());
        System.out.println("请输入年龄:");
        person.setAge(sc.nextInt());
        person.toString();
    }
}
class Person {
    private String name;
    private String sex;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        if(sex.equals("男") || sex.equals("女")) {
            this.sex = sex;
        }else {
            throw new RuntimeException("性别不符合要求!");
        }
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        if(age > 0 && age <= 120) {
            this.age = age;
        }else {
            //抛出异常
            throw new RuntimeException("年龄不符合要求!");
        }
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", sex=" + sex + ", age=" + age + "]";
    }
}

注:
  1、如果输入的性别不是男或者女,就会抛出异常 " 性别不符合要求! " ;
  2、如果输入的年龄不在1和120之内(包括1和120),就会抛出异常 " 年龄不符合要求! " 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值