javaSE之异常详解(1)

什么是异常

表面上:异常就是当你的程序有错误时给出的错误提示,比如当你写了个简单的程序

public class 异常 {
    public static void main(String[] args){
        int a = 10;
        int b = 0;
        int c = a/b;
        System.out.println("a"+"/"+"b"+"="+c);
    }
}

明显可以看出b是不能为0的,会报错,这个报错就是异常,结果如下

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at TestDay25.异常.main(异常.java:7)

Process finished with exit code 1

其中的java.lang.ArithmeticException: / by zero就是抛出的异常信息,由JVM打印输出

实际上:异常以类和对象形式存在,既然是类,就可以new异常对象

异常类在java.lang包下

异常类new对象

既然异常是类,那么就可以new对象,例子如下

NumberFormatException nfe = new NumberFormatException("数字格式化异常");
        System.out.println(nfe);

结果如下

java.lang.NumberFormatException: 数字格式化异常

Process finished with exit code 0

没有new异常对象,JVM为毛会打印异常信息

如上面的那个简单的代码例子,当JVM执行 int c = a/b;时,检测到b为0,JVM会自动new当前情况所对应的异常对象,形参会传入"/ by zero",于是就出现了上面的结果

异常继承结构之可处理异常

Object

Object下有Throwable ( 可抛出的,是所有异常类的祖宗类,直接或间接继承)

Throwable下有两个分支:Error (不可处理,直接退出JVM)和Exception (可处理的)

Exception下有两个分支:

Exception的直接子类:编译时异常(要求程序员在编写程序阶段必须预先对这些异常进行处理,如果不处理编译器报错,因此得名编译时异常)。

详解:所有Exception的直接子类,都叫做编译时异常。编译时异常是在编译阶段发生的吗?不是。编译时异常是表示必须在编写程序的时候预先对这种异常进行处理,如果不处理编译器报错。编译时异常发生概率较高。编译时异常又诚称为受检异常,还有叫做受控异常。

RuntimeException:运行时异常。(在编写程序阶段程序员可以预先处理,也可以不管,都行)

详解:所有的RuntimeException及子类都属于运行时异常。运行时异常在编写程序阶段,你可以选择处理,也可以不处理。运行时异常发生概率较低。运行时异常还有另外一些名字;未受检异常,或者非受控异常。

编译时异常和运行时异常,都是发生在运行阶段。编译阶段异常是不会发生的。编译时异常因为什么而得名?

因为编译时异常必须在编译(编写)阶段预先处理,如果不处理编译器报错,因此得名。

所有异常都是在运行阶段发生的。因为只有程序运行阶段才可以new对象。

因为异常的发生就是new异常对象。

编译时异常和运行时异常的区别?

编译时异常一般发生的概率比较高。

举个例子:
你看到外面下雨了,倾盆大雨的。
你出门之前会预料到:如果不打伞,我可能会生病(生病是一种异常)。而且这个异常发生的概率很高,所以我们出门之前要拿一把伞。
"拿一把伞"就是对"生病异常"发生之前的一种处理方式。
对于一些发生概率较高的异常,需要在运行之前对其进行预处理。

运行时异常一般发生的概率比较低。

举个例子:
小明走在大街上,可能会被天上的飞机轮子砸到。被飞机轮子砸到也算一种异常。
但是这种异常发生概率较低。
在出门之前你没必要提前对这种发生概率较低的异常进行预处理。如果你预处理这种异常,你将活的很累。

假设你在出门之前,你把能够发生的异常都预先处理,你这个人会更加的安全,但是你这个人活的很累。

假设java中没有对异常进行划分,没有分为:编译时异常和运行时异常,所有的异常都需要在编写程序阶段对其进行预处理,将是怎样的效果呢?

首先,如果这样的话,程序肯定是绝对的安全的。
但是程序员编写程序太累,代码到处都是处理异常的代码。

编译时异常还有其他名字:

受检异常: CheckedException

受控异常

运行时异常还有其它名字:

未受检异常:UnCheckedException

非受控异常

再次强调:所有异常都是发生在运行阶段的。

异常处理

Java语言中对异常的处理包括两种方式:

第一种方式:在方法声明的位置上,使用throws关键字,抛给上一级。

谁调用我,我就抛给准。抛给上一级。

第二种方式:使用try . .catch语句进行异常的捕捉。

这件事发生了,谁也不知道,因为我给抓住了。

举个例子:

我是某集团的一个销售员,因为我的失误,导致公司损失了1000元,"损失1000元"这可以看做是一个异常发生了。
我有两种处理方式
第一种方式:我把这件事告诉我的领导【异常上抛】
第二种方式:我自己掏腰包把这个钱补上。【异常的捕捉】

思考:

异常发生之后,如果我选择了上抛,抛给了我的调用者,调用者需要对这个异常继续处理,那么调用者处理这个异常同样有两种处理方式.

张三-->李四--->王五-->CEO

注意:Java中异常发生之后如果一直上抛,最终抛给了main方法,main方法继续向上抛,抛给了调用者JVM,JVM知道这个异常发生,只有一个结果。终止java程序的执行。

本站部分文章资源来源于互联网,仅供学习交流,如若要商用,请购买正版!
若不听劝告,网友造成出现一切后果,与本站本人无关
本站有些资源未经测试,请注意网络安全,本站不对下载的资源造成的后果负责
免责声明
作者:昼白
转载请注明来源:https://www.zhoubaiwl.club/2027.htm
THE END
分享
二维码
打赏
< <上一篇
下一篇>>