Java-异常

异常

什么是异常

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bvo91ufJ-1612951930727)(流程控制学习.assets/什么是异常.png)]

异常的简单分类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Usqxv9tW-1612951930729)(流程控制学习.assets/异常简单分类.png)]

异常体系结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q8qfWxDh-1612951930730)(流程控制学习.assets/异常体系结构.png)]

Error

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IbjVVf2L-1612951930733)(流程控制学习.assets/什么是Error.png)]

Exception

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D5CRd1lx-1612951930734)(流程控制学习.assets/什么是Exception.png)]

异常处理机制

抛出异常

捕获异常

异常处理五个关键字

try,catch,finally,throw,throws

try-catch-finally(捕获异常)

int a = 1;
int b = 0;
System.out.println(a/b);//除数为0,运行时会出现下面的异常
/*
输出结果为:
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at com.exception.Test.main(Test.java:8)
*/
ackage com.exception;

public class Test {
    public static void main(String[] args) {
        int a = 1;
        int b = 0;
        try{//try 监控异常
            System.out.println(a/b);
        }catch(ArithmeticException e){//catch 捕获异常
            System.out.println("程序出现错误,变量b不能为0");
        }finally {//处理善后工作
            System.out.println("finally");
        }
        //可以不要finally,这个适用于处理善后,比如假设IO,资源,关闭!
    }
}
/*
输出结果为:
程序出现错误,变量b不能为0
finally
*/
//catch(想要捕获的异常类型 异常的实例)
catch(ArithmeticException e)
int a = 1;
int b = 0;
try{//try 监控异常
    System.out.println(a/b);
}catch(Error e){
    System.out.println("Error");
}catch (Exception e){
    System.out.println("Exception");
}catch (Throwable e){
    System.out.println("Throwable");
}
finally {//处理善后工作
    System.out.println("finally");
}
/*
输出结果:
Exception
finally

注意:
可以写多个catch,但是catch括号内的异常类型要由低到高,不然就会编译报错。
可以查看异常体系结构的图,最高异常类型"Throwable"必须在最下面!
当catch从上到下,捕获到其中一个异常类型就直接进入"finally"。
*/

快捷键ctrl+alt+T,选中当前光标中的代码,快速完成try-catch-finally代码.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xFHeWruk-1612951930736)(流程控制学习.assets/catch快捷键.png)]

int a = 1;
int b = 0;
//ctrl+alt+T
try {
    System.out.println(a/b);
} catch (Exception e) {
    e.printStackTrace();//打印错误的栈信息
} finally {
}

throw-主动抛出异常

在这个方法中解决异常

package com.exception;
public class Test {
    public static void main(String[] args) {       
        new Test().test(1,0);
    }
    public void test(int a,int b){
        if(b==0){
            //主动抛出异常,一般在方法中使用
            throw new ArithmeticException();
        }
    }
}
/*
看起来很正常的代码,但是输出结果还是会显示错误,因为主动抛出异常:
Exception in thread "main" java.lang.ArithmeticException
	at com.exception.Test.test(Test.java:35)
	at com.exception.Test.main(Test.java:30)
*/

throws-方法上抛出异常

让在外面调用这个方法的人解决异常

package com.exception;
public class Test {
    public static void main(String[] args) {       
        /*  throws的好处就是当有异常时,配合try-catch-finally尝试解决异常,
            使得代码能够运行下去,否则出现处理不了异常可能会导致程序暂停运行        
         */
        try {//方法上抛出异常后,使用try-catch-finally代码解决这个异常
            new Test().test(1,0);
        } catch (ArithmeticException e) {
            e.printStackTrace();
        } finally {
        }
    }    
    //假设这方法中,处理不了这个异常,方法上抛出
    public void test(int a,int b) throws ArithmeticException{
        if(b==0){
            //主动抛出异常,一般在方法中使用
            throw new ArithmeticException();
        }
    }
}

自定义异常

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mrim4xzx-1612951930737)(流程控制学习.assets/自定义异常.png)]

package com.exception.demo02;
//自定义异常类:首先要继承Exception类
public class MyException extends Exception {

    //传递数字>10: 假设数字大于10就报异常
    private int detail;

    public MyException(int a) {
        this.detail = a;
    }

    //toString:异常的打印信息
    //alt+insert:->toString()
    //重写toString:可以按照自己想要的格式打印异常信息

    @Override
    public String toString() {
        return "MyException{" + "detail=" + detail + '}';
    }
}
package com.exception.demo02;

public class Test {
    //可能会存在异常的方法
    static void test(int a) throws MyException {
        System.out.println("传递的参数为:" + a);
        if(a>10){
            //此处有两个选择
            //1.在此方法中捕获异常try-catch-finally
            //2.抛出异常,由外面调用这个方法的代码去捕获
            throw new MyException(a);//此处选择抛出
        }
        System.out.println("OK");
    }

    public static void main(String[] args) {
        //捕获异常
        try {
            test(11);
        } catch (MyException e) {
            //e.printStackTrace();
            //增加一些处理异常的代码块
            System.out.println("MyException->" + e);//打印信息
        } finally {
        }
    }
}
/*
输出信息:
传递的参数为:11
MyException->MyException{detail=11}
*/

上面第11行代码有快捷键,将光标放在代码上->alt+enter,可以有两种选择:

  1. Add exception…(throws 抛出异常)
  2. Surround with try/catch(捕获异常)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5DdPDqlE-1612951930737)(流程控制学习.assets/处理异常.png)]

异常-总结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J85NzfTT-1612951930737)(流程控制学习.assets/异常-实际应用中的经验总结.png)]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值