java详解 --- 异常处理

一.异常处理

异常处理是继承Throwable的子类,有两种:Error 和 Exception.
Error是系统崩溃或者数据库崩溃,和代码的编写没有关系.
Exception是和代码有关系的,是一种异常.

二.解决方式

1.出现异常系统解决的办法:
以main函数为例:有两种方式
①.main函数自己解决
②.把问题抛给上级去解决(谁调用main函数就让谁解决)
main函数就会抛给jvm虚拟机处理.
jvm在控制台打印错误信息 和 错误发生在什么类的什么位置.

2.自己解决的办法:使用try…catch…捕获异常
结构:
try{

}catch{

}
捕获异常的流程:
①.程序发生异常
②.根据发生的异常 产生对应的异常对象
③.这个异常对象会返回给调用者
④.如果调用者处理了这个异常(添加了try…catch…方法)
异常对象会继续于catch中的语句进行匹配,如果匹配上了,就继续执行这个程序
⑤.如果调用者没有处理这个异常,那么就会默认交给jvm虚拟机处理,根据产生的异常对象打印错误信息,结束程序

3.多catch捕获异常
多catch捕获异常可以帮助你完善代码,让出现的异常更容易被找到.
如果还要使用Exception匹配异常,需要写在最后,不然写了详细匹配的catch就会失效了
代码举例:

public static void main(){
    int[] array = {1,2,3,4,5};
    try{
        System.out.println(array[10]);
        System.out.println(10/0);
    }catch(ArithmeticException e){
        System.out.println("除数为0了");
    }catch(ArrayIndexOutOfBoundsException e){
        System.out.println("数组越界了");
    }catch(Exception e){
        System.out.println("你出错了");
    }
}

三.运行时异常和编译时异常

实际写代码时,不是运行时异常就是编译时异常
1.定义
运行时代异常:出现运行时代码就是你的代码有问题(程序员长犯的错误)
编译时异常:出现编译时异常系统会提前预警,强制你去处理,不处理编译都不会处理

2.解决方法
运行时异常前面都已经说过了.使用try…catch…或者抛给上级处理.
编译时异常其实就是系统这时候不知道你有没有这个文件,就相当于系统问你,要是没有这个文件怎么办,要求你做出解释,提前做出解决办法,这就是编译时异常.是对问题的一种提前准备.
解决办法;
①.自己处理,使用try…catch…
②.把异常抛出去(谁调用就抛给谁)

3.例题举例:

需求: 创建一个人类 name 和 age
要求: 人类的年龄赋值时 要在 0 到 100 岁 之间

public static void main(String[] args)throws Exception{
    Person person = new Person();
    person.setAge(-16);
    System.out.println(person.getAge());
}
class Person{
    private String name;
    private int age;

    // 无参/有参构造方法
    public Person() {
        super();
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    //set/get方法
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    // 如果这个方法 要抛出异常给调用者
    // 必须在方法的声明中 标识这个方法为异常方法
    // throw 和 throws 的区别?
    // throw 是用来抛出一个异常对象(在方法中出现)
    // throws 是用来标识一个方法 可以抛出一个异常(在方法的声明中出现)
    public void setAge(String age)throws Exception{
        if(age > 0 && age < 100){
            this.age = age;
        }else{
        // 抛出一个异常 告诉输入的年龄有误
            // 使用自定义类处理异常
            AgeOutofBoundsException exception = new AgeOutofBoundsException("年龄有误");
            // 把异常对象抛出去
            throw exception;
            // 使用匿名对象抛出异常
            // throw new Exception("年龄有误"); 
        }
    }

    // 重写toString方法
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
}
class AgeOutOfBoundsException extends Exception{
    // 序列化时 需要id
    private static final long serialVersionUID = 1L;
    public AgeOutOfBoundsException(){
        super();
    }

    public AgeOutofBoundsException(String message) 
    {
        super(message);
    }
}

四.异常转移

当出现异常时,先捕获异常,但是无权处理.所以要将异常上抛,且进一步确定异常种类,然后上抛给可以处理的方法进行处理.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值