java学习之异常二

目录

一、异常处理机制

 一、try-catch-finally

 二、throws

二、try-catch 异常处理使用细节

 三、try-catch-finally练习

第一题

第二题

第三题

第四题


一、异常处理机制

共有两种异常处理机制

 一、try-catch-finally

处理机制图示

 二、throws

 关于第二点,如Exception01.java中所示,就算没有用try-catch处理,直接运行,也是会报错的,因为有默认的 throws Exception

package com.hspedu.exception_;

/**
 * @author GQQ
 * @version 1.0
 */
public class Exception01 {
    public static void main(String[] args) throws Exception{
        int num1 = 10;
        int num2 = 0;
       
        int res = num1 / num2;
                
         System.out.println("程序继续运行....");
    }
}

二、try-catch 异常处理使用细节

 

package com.hspedu.exception_;

/**
 * @author GQQ
 * @version 1.0
 */
public class TryCatchDetail {
    public static void main(String[] args) {
        //1. 如果异常发生了, 则异常发生后面的代码不会执行, 直接进入到 catch 块
        //2. 如果异常没有发生, 则顺序执行 try 的代码块, 不会进入到 catch
        //3. 如果希望不管是否发生异常, 都执行某段代码(比如关闭连接, 释放资源等)则使用如下代码- finally
        try {
            String str = "java学习";
            //String str = "123";
            int a = Integer.parseInt(str);
            System.out.println("数字" + a);//发生异常后,就不会再执行此输出语句
        } catch (NumberFormatException e) {
            System.out.println("异常信息=" + e.getMessage());
        }finally{
            System.out.println("代码块被执行...");
        }
        System.out.println("程序继续...");
    }
}

 

package com.hspedu.exception_;

/**
 * @author GQQ
 * @version 1.0
 */
public class TryCatchDetail02 {
    public static void main(String[] args) {
        //1.如果 try 代码块有可能有多个异常
        //2.可以使用多个 catch 分别捕获不同的异常, 相应处理
        //3.要求子类异常写在前面, 父类异常写在后面,如果子类写在后面,会提示 这些异常已经被捕获了
        try {
            Person person = new Person();
            person = null;
            System.out.println(person.getName());//NullPointerException
            int num1 = 10;
            int num2 = 0;
            int res = num1 / num2;//ArithmeticException
            //分别处理两种异常
        } catch (NullPointerException e) {
            System.out.println(e.getMessage());
        } catch (ArithmeticException e) {
            System.out.println(e.getMessage());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {

        }
        System.out.println(123);

    }
}

class Person {
    private String name = "jack";

    public String getName() {
        return name;
    }
}

package com.hspedu.exception_;

/**
 * @author GQQ
 * @version 1.0
 */
public class TryCatchDetail03 {
    public static void main(String[] args) {
        try{
            int n1 = 10;
            int n2 = 0;
            System.out.println(n1 / n2);
        }finally {
            //没有捕捉异常,其实是用了 throws Exception,还是会执行finally里的语句
            System.out.println("执行了finally...");
        }
        System.out.println("程序继续执行...");//当出现异常的时候此语句不会被执行
    }
}

 三、try-catch-finally练习

第一题

package com.hspedu.exception_;

/**
 * @author GQQ
 * @version 1.0
 */
public class ExceptionExercise01 {
    public static int method() {
        try {
            String[] names = new String[3];
            //names[1]的默认值为null,把null和tom比较会直接报空指针异常
            if (names[1].equals("tom")) {
                System.out.println(names[1]);
            } else {
                names[3] = "hspedu";
            }
            return 1;
        } catch (ArrayIndexOutOfBoundsException e) {
            return 2;
        } catch (NullPointerException e) {
            //空指针异常后会直接return 3,然后跳出整个method方法,但是finally里的语句必须被执行
            //所以这里的3不return
            return 3;
        } finally {
            //最后是return 4,也就是说结果是输出4
            return 4;
        }
    }

    public static void main(String[] args) {
        System.out.println(method());//4
    }

}



涉及知识点:

1.String型变量的默认值为null ,当用null进行运算时就会报空指针异常

 2.return表示跳出/结束这个方法,但是finally中的语句必须要执行,此时finally的优先级大于return

第二题

package com.hspedu.exception_;

/**
 * @author GQQ
 * @version 1.0
 */
public class ExceptionExercise02 {
    public static int method() {
        int i = 1;
        try {
            i++;
            String[] names = new String[3];
            if (names[1].equals("tom")) {//names[1]的默认值为null,把null和tom比较会直接报空指针异常
                System.out.println(names[1]);
            } else {
                names[3] = "hspedu";
            }
            return 1;
        } catch (ArrayIndexOutOfBoundsException e) {
            return 2;
        } catch (NullPointerException e) {
            //空指针异常后会执行return ++i,然后跳出整个method方法,但是finally里的语句必须被执行
            //所以这里只是完成 i的自增,并不会return
            return ++i;
        } finally {
            //最后是return 4,也就是说结果是输出4
            return ++i;
        }
    }

    public static void main(String[] args) {
        System.out.println(method());//4
    }
}

知识点:在捕捉到空指针异常的

catch (NullPointerException e) {
    //空指针异常后会执行return ++i,然后跳出整个method方法,但是finally里的语句必须被执行
    //所以这里只是完成 i的自增,并不会return
    return ++i;
}

由于finally的存在,此处虽然不会返回,但是++i的运算还是会执行

第三题

package com.hspedu.exception_;

/**
 * @author GQQ
 * @version 1.0
 */
public class ExceptionExercise03 {
    public static int method() {
        int i = 1;
        try {
            i++;
            String[] names = new String[3];
            if (names[1].equals("tom")) {//names[1]的默认值为null,把null和tom比较会直接报空指针异常
                System.out.println(names[1]);
            } else {
                names[3] = "hspedu";
            }
            return 1;
        } catch (ArrayIndexOutOfBoundsException e) {
            return 2;
        } catch (NullPointerException e) {
            //空指针异常后会执行return ++i,然后跳出整个method方法,但是finally里的语句必须被执行
            //所以这里只是 return 2, 然后2被临时变量temp保存起来 temp = 2
            //然后完成i++, i = 3
            return i++;
        } finally {
            //++i, i = 4;
            ++i;
            System.out.println("i=" + i);
        }
    }
    public static void main(String[] args) {
        System.out.println(method());//2和4
    }

}

第四题

 

package com.hspedu.exception_;

import java.util.Scanner;

/**
 * @author GQQ
 * @version 1.0
 */
public class ExceptionExercise04 {
    public static void main(String[] args) {
        while(true){
            System.out.print("请输入要判断的数字:");
            Scanner scanner = new Scanner(System.in);
            try {
                String str = scanner.next();
                int num = Integer.parseInt(str);
                System.out.println("输入的整数为:" + num);
                break;//如果上述输出语句能够执行,说明没有捕捉到异常,结束循环
            } catch (NumberFormatException e) {
                System.out.println("你输入的不是整数,请重新输入");
            }

        }

    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值