异常及异常处理学习

异常

1. 异常

异常:指程序在执行过程中出现非正常的情况,最终导致jvm会非正常停止;
异常体系如图:

  • Error:严重错误Error,无法通过处理的错误,只能事先避免,好比绝症。
  • Exception:表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的。好比感冒、阑尾炎。
    在这里插入图片描述

Throwable中的常用方法:

  • public void printStackTrace():打印异常的详细信息。

    包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。

  • public String getMessage():获取发生异常的原因。

    提示给用户的时候,就提示错误原因。

  • public String toString():获取异常的类型和异常描述信息(不用)。

public class Demo1 {
    public static void main(String[] args) {
        try{
            int i = 1/0;
        }catch (Exception e){
            System.out.println(e.toString());//java.lang.ArithmeticException: / by zero
            System.out.println(e.getMessage());// / by zero
            e.printStackTrace(); 
            /*java.lang.ArithmeticException: / by zero
	                at com.cyy.demo3.Demo1.main(Demo1.java:6)*/
        }
    }
}

异常产生的过程:
在这里插入图片描述

2. 异常处理

Java异常处理的五个关键字:try、catch、finally、throw、throws
1、抛出异常throw:用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行
使用格式:throw new 异常类名(参数);

public class Demo3 {
    public static void main(String[] args) throws Exception {
        int[] arr = {2,34,6,4};

        f1(arr,5);
    }
    public static void f1(int[] arr,int i) throws Exception {
        if(i<0 || i>arr.length-1){
            throw new Exception("数据越界了");
        }
        System.out.println(arr[i]);
    }
}
/*
Exception in thread "main" java.lang.Exception: 数据越界了
	at com.cyy.demo3.Demo3.f1(Demo3.java:11)
	at com.cyy.demo3.Demo3.main(Demo3.java:7)
*/

2、声明异常throws:将问题标识出来,报告给调用者。如果方法内通过throw抛出了编译时异常,而没有捕获处理,那么必须通过throws进行声明,让调用者去处理。
使用格式:修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{ }

3、捕获异常try…catch:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理。
使用格式:

try{
     编写可能会出现异常的代码
}catch(异常类型  e){
     处理异常的代码
     //记录日志/打印异常信息/继续抛出异常
}

一个try后面可以接对个catch:

try{
     编写可能会出现异常的代码
}catch(异常类型A  e){try中出现A类型异常,就用该catch来捕获.
     处理异常的代码
     //记录日志/打印异常信息/继续抛出异常
}catch(异常类型B  e){try中出现B类型异常,就用该catch来捕获.
     处理异常的代码
     //记录日志/打印异常信息/继续抛出异常
}

注意:这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。

finally 代码块:有一些特定的代码无论异常是否发生,都需要执行。
finally的语法:
try…catch…finally:自身需要处理异常,最终还得关闭资源。

注意:finally不能单独使用。

public class Demo4 {
    public static void main(String[] args) {
        int[] arr = {34,65,76,32};
        try{
            int i = arr[3];
            System.out.println(i);
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("程序出现异常~~~~~~");
        }finally {
            System.out.println("关闭资源~~~~~");
        }
    }
}
/*
1、当程序没有异常时,程序不会执行catch里面的代码,执行结果为:
32
关闭资源~~~~~
2、当程序出现异常时,从出现异常之后的代码都不会执行,直接执行catch里面的代码,执行结果为:
java.lang.ArrayIndexOutOfBoundsException: 5
	at com.cyy.demo3.Demo4.main(Demo4.java:7)
程序出现异常~~~~~~
关闭资源~~~~~
3、无论程序出不出现议程,finally里面的代码最终都会执行;	
*/

3. 自定义异常

1、自定义一个登陆异常类

public class LoginException extends Exception {
    public LoginException() {
    }
    public LoginException(String message) {
        super(message);
    }
}

2、模拟登陆失败

public class Demo5 {
    public static void main(String[] args){
         String[] name = {"张三","李四","小明","小红"};

        try {
            login(name,"赵六");
        } catch (LoginException e) {
            e.printStackTrace();
        }

    }
    public static void login(String[] names,String name) throws LoginException {
        for (String s : names) {
            if(s.equals(name)){
                System.out.println("请输入密码:-------");
            }else{
                throw new LoginException("用户名不正确");
            }
        }
    }
}
//当用户名不存在是抛出异常,打印异常信息
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值