---异常

.1 异常介绍

异常就是代表程序出现的问题

 分为编译时期和运行时期的异常

Error 代表系统级别错误,不用管

Exception 异常 代表程序可能出现的问题

运行时异常 RuntimeException及其子类 如数组索引越界异常

                   由字节码文件通过Java命令时代码出错而导致的程序错误

编译时异常 编译阶段出现的异常 如日期解析类异常

                    Java文件通过Javac命令生成字节码文件时的异常来提醒程序员检查本地信息

作用 :

异常是用来查询bug的关键参考信息

异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况

.2 异常处理方法 

.2.1 JVM默认的处理方式

把异常的的名称,异常原因及异常出现位置等信息输出在控制台

程序停止执行,下面的代码不会再执行了

    public static void first(){

        System.out.println("01...");
        System.out.println(2/0);
        System.out.println("看看我在第一种方式里面执行了吗");
    }

.2.2 自己处理(捕获异常)

try{

可能出现异常的代码
}catch (异常类型 e){

异常的处理代码
}

好处:

         当代码出现异常时,可以让程序继续往下执行

如果try里面没有遇到问题会把try里面的代码执行完然后跳过catch,只有发生异常时才会执行对应异常类型的catch

try里面多个异常要写多个catch对应,如果有子父级关系,父级的异常一定到写在自己catch的下面

如果try-catch没有捕获到出现的异常,那么就会交给虚拟机进行默认处理方式

    public static void second(){
        int[] arr = {1,2,3,4,5,6,7,8};

        try {
            //肯出错的代码
            System.out.println(arr[10]);//在这里出现了索引越界的异常,程序就会创建一个ArrayIndexOutOfBoundsException 对象
                                        // new ArrayIndexOutOfBoundsException()
                                        // 拿着这个对象到catch的小括号中对比,看括号中变量是否可以接收这个对象
                                        //如果能被接收,就表示该异常被捕获了,执行catch里面对应的代码
                                        //当catch里面所有的代码执行完毕 继续执行try   catch之后的代码
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("索引越界了");
        }
        System.out.println("看看我在第二种方式里面执行了吗");
    }

 .3 Throwable的成员方法

方法名称说明
public String getMessage()返回throwable的详细消息字符串
public String toString()返回此可抛出的简短描述
public void printStackTrace()把异常的错误信息输出在控制台

printStackTrace()方法包括了getMessage()和toString()

public class ExceptionDemo2 {
    public static void main(String[] args){
        first();
        second();
        third();
    }
    public static void first(){
        int[] arr = {1,2,34,5,6,7,8,9};
        try{
            System.out.println(arr[10]);
        }catch (ArrayIndexOutOfBoundsException e){
            String message = e.getMessage();
            System.out.println(message);
            System.out.println("-----------------------------------");
        }

    }
    public static void second(){
        int[] arr = {1,2,34,5,6,7,8,9};
        try{
            System.out.println(arr[10]);
        }catch (ArrayIndexOutOfBoundsException e){
            String string = e.toString();
            System.out.println(string);
            System.out.println("-----------------------------------");
        }
    }
    public static void third(){
        int[] arr = {1,2,34,5,6,7,8,9};
        try{
            System.out.println(arr[10]);
        }catch (ArrayIndexOutOfBoundsException e){
            e.printStackTrace();//包含了上面两个方法的内容,且是红色字体打印。。
        }
    }
}

 .3 抛出处理

throws 写在方法定义处,表示声明一个异常告诉调用者,使用本方法肯会有哪些异常

编译时的异常必须要写,运行时异常可以不写

        public void 方法()throws 异常类名1....n{}

throw 写在方法内,结束方法手动抛出异常对象,交给调用者,方法中下面的代码不再执行

        throw new NullPointerException();

.4 自定义异常类

为了让控制台的报错信息更加见名知意

方法:

        定义异常类

        写继承关系

        空参构造

        带参构造

//自定义异常类
public class NameFormatException extends RuntimeException{
    //技巧:
    // NameFormat: 当前异常的名字,表示姓名格式化问题
    //Exception: 表示当前类是一个异常类

    //运行时: RuntimeException 核心就表示由于参数错误而导致的问题
    //编译时 Exception 核心 提醒程序员检查本地信息

    public NameFormatException() {
    }

    public NameFormatException(String message) {
        super(message);
    }
}
public class ExceptionDemo4 {
    public static void main(String[] args){
        //创建键盘录入对象
        Scanner input = new Scanner(System.in);
        //创建Javabean对象
        GirlFriend gf = new GirlFriend();
        while(true){
            try {
                System.out.println("请输入名称:");
                String name = input.nextLine();
                gf.setName(name);
                System.out.println("请输入年龄:");
                String strAge = input.nextLine();
                int age = Integer.parseInt(strAge);
                gf.setAge(age);
                break;
            }catch (NumberFormatException e){
                e.printStackTrace();
            }catch (NameFormatException e){//自定义异常类
                e.printStackTrace();
            }catch (AgeOutOfBoundsException e){
                e.printStackTrace();
            }
        }
        System.out.println(gf);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值