【Java基础】异常

一、异常的概念

异常指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理。Java中异常的继承体系如下:

Object
    Throwable 
       Exception   
            编译时异常
            RuntimeException
       Error

Exception

  • 编译时异常:
    • 所有Exception的直接子类以及子孙类都是“编译时异常”
    • 该异常是可预期,很有可能发生的,发生的机率比较高
    • 所有的编译时异常,要求程序员在编写程序阶段,必须对它进行处理,如果不处理的话,编译无法通过。处理异常有两种方式:捕捉和声明抛出。捕捉:try…catch…,声明抛出就是在方法声明的位置上使用throws关键字抛出异常
  • 运行时异常:
    • 所有RuntimeException的子类都是运行时异常
    • 该类异常不一定发生,发生的机率比较低,如果代码没有出现逻辑错误,是不会发生
    • 编译器不要求去处理,程序员在写代码时可以不处理

Error

  • java程序运行过程中如果出现了错误,属于JVM和系统发生的错误,程序员无法解决的问题。例如:StackOverFlowError (一旦线程栈的大小增长超过了允许的内存限制,就会抛出 java.lang.StackOverflowError 错误)

非受检异常(unchecked):将派生于Error或RuntimeException类的所有异常称为非首检异常,其他所有的异常称为受检异常(checked)异常

二、异常的处理方式

  • 使用throws 抛出异常
  • 使用try…catch处理异常

1.使用throws 抛出异常

1.1 首先看一下要求异常处理的代码

public class Test02 {
    public static void main(String[] args) {
        m1();
    }

    public static void m1() {
        m2();
    }

    private static void m2() {
        m3();
    }

    private static void m3() {
        new FileInputStream("D:/x.txt");
    }
}
  • 以上程序会发现FileInputStream在编译的时候会报红色波浪线

  • 看源码发现FileInputStream这个构造方法在声明的位置上使用了throws FileNotFoundException(向上抛)

  • FileNotFoundException继承Exception类,所以属于编译时异常,要求程序员必须对其进行异常处理(throws抛出或者try…caych)

1.2 对上述代码使用throws抛出异常

在方法声明的位置上使用throws FileNotFoundException就可以编译通过了,或者写IOException,或者写Exception,写比FileNotFoundException更宽泛的异常就可以。

public class Test02 {
    public static void main(String[] args) throws FileNotFoundException {
        m1();
    }

    public static void m1() throws FileNotFoundException {
        m2();
    }

    private static void m2() throws FileNotFoundException {
        m3();
    }

    private static void m3() throws FileNotFoundException {
        new FileInputStream("D:/x.txt");
    }
}
  • 上诉程序可以看出,从调用m3方法开始一直向上抛异常,直到m1方法出现了异常,并且采用的是上抛,再抛给main方法,最终抛给了JVM(java虚拟机),JVM遇到这个异常就会退出JVM,下面的"Hello World!"字符串字样就不会打印输出。
  • 上述程序编译没有问题,打印输出信息如下
Exception in thread "main" java.io.FileNotFoundException: D:\x.txt (系统找不到指定的文件。)
	at java.io.FileInputStream.open0(Native Method)
	at java.io.FileInputStream.open(FileInputStream.java:195)
	at java.io.FileInputStream.<init>(FileInputStream.java:138)
	at java.io.FileInputStream.<init>(FileInputStream.java:93)
	at com.example.demo.exception.Test02.m3(Test02.java:27)
	at com.example.demo.exception.Test02.m2(Test02.java:23)
	at com.example.demo.exception.Test02.m1(Test02.java:19)
	at com.example.demo.exception.Test02.main(Test02.java:13)

Process finished with exit code 1
  • 可以看出在程序运行过程中发生了FileNotFoundException类型的异常
  • JVM为我们创建了一个FileNotFoundException类型的对象
  • 该对象中携带以下的信息
  • JVM负责将该对象的信息打印到控制台
  • 并且JVM停掉了程序的运行

如果对m1方法进行try…catch进行捕捉:

try {
            m1();
        } catch (FileNotFoundException e) {
            System.out.println("假装处理了问题");
        }

        System.out.println("hello world");

可以看出,如果对m1方法进行try…catch处理,捕捉到了这个异常并且处理了这个异常,那么"Hello World!"就会打印输出

1.3 总结

  • 使用throws处理异常不是真正处理异常而是推卸责任,如果想要处理该异常,使用try…catch进行捕捉,就不会抛给JVM而使程序异常退出

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值