《Java编程的逻辑》笔记23--异常(上)

《Java编程的逻辑》笔记23--异常(上)_第1张图片
异常 (上).png

概念

操作的过程中可能有很多出错的情况,出错的原因可能是多方面的,有的是不可控的内部原因量未初始化就直接调用实例方法。这些非正常情况在Java中统一被认为是异常,Java使用异常机制来统一处理

常见异常

  • NullPointerException (空指针异常)
    (1)案例
public class ExceptionTest {
    public static void main(String[] args) {
        String s = null;
        s.indexOf("a");
        System.out.println("end");
    }
}

(2)输出

Exception in thread "main" java.lang.NullPointerException
    at ExceptionTest.main(ExceptionTest.java:5)

(3)解析
输出是告诉我们:在ExceptionTest类的main函数中,代码第5行,出现了空指针异常(java.lang.NullPointerException)。
执行s.indexOf("a")的时候,Java系统发现s的值为null, 没有办法继续执行了,这时就启用异常处理机制,首先创建一个异常对象,这里是类NullPointerException的对象,然后查找看谁能处理这个异常,在示例代码中,没有代码能处理这个异常,Java就启用默认处理机制,那就是打印异常栈信息到屏幕,并退出程序。异常发生点后的代码都不会执行,所以示例代码中最后一行System.out.println("end")不会执行
异常栈信息就包括了从异常发生点到最上层调用者的轨迹,还包括行号,可以说,这个栈信息是分析异常最为重要的信息

  • NumberFormatException (数字格式异常)
    (1)案例
public class ExceptionTest {
    public static void main(String[] args) {
        if(args.length<1){
            System.out.println("请输入数字");
            return;
        }
        int num = Integer.parseInt(args[0]);
        System.out.println(num);
    }
}

(2)当输入123输出123,当输入abc输出

Exception in thread "main" java.lang.NumberFormatException: For input string: "abc"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:492)
    at java.lang.Integer.parseInt(Integer.java:527)
    at ExceptionTest.main(ExceptionTest.java:7)

(3)解析
args表示命令行参数,这段代码要求参数为一个数字
栈信息
NumberFormatException类65行


65行

Integer类492行


image.png

new NumberFormatException(...)是我们容易理解的,就是创建了一个类的对象,只是这个类是一个异常类
throw就是抛出异常,它会触发Java的异常处理机制。在之前的空指针异常中,我们没有看到throw的代码,可以认为throw是由Java虚拟机自己实现的。

throw VS return

return代表正常退出,throw代表异常退出,return的返回位置是确定的, 就是上一级调用者,而throw后执行哪行代码则经常是不确定的,由异常处理机制动态确定。

捕获"try/catch

(1)案例

public class ExceptionTest {
    public static void main(String[] args) {
        if(args.length<1){
            System.out.println("请输入数字");
            return;
        }
        try{
            int num = Integer.parseInt(args[0]);
            System.out.println(num);    
        }catch(NumberFormatException e){
            System.err.println("参数"+args[0]
                    +"不是有效的数字,请输入数字");
        }
    }
}

(2)分析
我们使用try/catch捕获并处理了异常,try后面的大括号{}内包含可能抛出异常的代码,括号后的catch语句包含能捕获的异常和处理代码,catch后面括号内是异常信息,包括异常类型和变量名,这里是NumberFormatException e,通过它可以获取更多异常信息,大括号{}内是处理代码,这里输出了一个更为友好的提示信息
捕获异常后,程序就不会异常退出了,但try语句内异常点之后的其他代码就不会执行了,执行完catch内的语句后,程序会继续执行catch大括号外的代码。

你可能感兴趣的:(《Java编程的逻辑》笔记23--异常(上))