关于java中的异常Exception类机制详解(运行时异常,编译异常,Error)java学习日记2021-09-07

0、异常处理机制
0.1、java中异常的作用是:增强程序健壮性。
0.2、java中异常以类和对象的形式存在。

1、java的异常处理机制

1.1、异常在java中以类和对象的形式存在。那么异常的继承结构是怎样的?
我们可以使用UML图来描述一下继承结构。
画UML图有很多工具,例如:Rational Rose(收费的)、starUML等....
	Object
	Object下有Throwable(可抛出的)
	Throwable下有两个分支:Error(不可处理,直接退出JVM)和Exception(可处理的)
	Exception下有两个分支:
		Exception的直接子类:编译时异常(要求程序员在编写程序阶段必须预先对这些异常进行处理,如果不处理编译器报错,因此得名编译时异常。)。
		RuntimeException:运行时异常。(在编写程序阶段程序员可以预先处理,也可以不管,都行。)

1.2、编译时异常和运行时异常,都是发生在运行阶段。编译阶段异常是不会发生的。
编译时异常因为什么而得名?
	因为编译时异常必须在编译(编写)阶段预先处理,如果不处理编译器报错,因此得名。
	所有异常都是在运行阶段发生的。因为只有程序运行阶段才可以new对象。
	因为异常的发生就是new异常对象。

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

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

			对于一些发生概率较高的异常,需要在运行之前对其进行预处理。

	运行时异常一般发生的概率比较低。
		举个例子:
			小明走在大街上,可能会被天上的飞机轮子砸到。
			被飞机轮子砸到也算一种异常。
			但是这种异常发生概率较低。
			在出门之前你没必要提前对这种发生概率较低的异常进行预处理。
			如果你预处理这种异常,你将活的很累。
	
	假设你在出门之前,你把能够发生的异常都预先处理,你这个人会更加
	的安全,但是你这个人活的很累。
	
	假设java中没有对异常进行划分,没有分为:编译时异常和运行时异常,
	所有的异常都需要在编写程序阶段对其进行预处理,将是怎样的效果呢?
		首先,如果这样的话,程序肯定是绝对的安全的。
		但是程序员编写程序太累,代码到处都是处理异常
		的代码。

1.4、编译时异常还有其他名字:
	受检异常:CheckedException
	受控异常

1.5、运行时异常还有其它名字:
	未受检异常:UnCheckedException
	非受控异常

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

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

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

	第二种方式:使用try..catch语句进行异常的捕捉。
		这件事发生了,谁也不知道,因为我给抓住了。

	举个例子:
		我是某集团的一个销售员,因为我的失误,导致公司损失了1000元,
		“损失1000元”这可以看做是一个异常发生了。我有两种处理方式,
		第一种方式:我把这件事告诉我的领导【异常上抛】
		第二种方式:我自己掏腰包把这个钱补上。【异常的捕捉】
		
		张三 --> 李四 ---> 王五 --> CEO
	
	思考:
		异常发生之后,如果我选择了上抛,抛给了我的调用者,调用者需要
		对这个异常继续处理,那么调用者处理这个异常同样有两种处理方式。

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

2、什么是UML?有什么用?
UML是一种统一建模语言。
一种图标式语言(画图的)
UML不是只有java中使用。只要是面向对象的编程语言,都有UML。
一般画UML图的都是软件架构师或者说是系统分析师。这些级别的人员使用的。
软件设计人员使用UML。

在UML图中可以描述类和类之间的关系,程序执行的流程,对象的状态等.

盖大楼和软件开发一样,一个道理。
	盖楼之前,会先由建筑师画图纸。图纸上一个一个符号都是标准符号。
	这个图纸画完,只要是搞建筑的都能看懂,因为这个图纸上标注的这些
	符号都是一种“标准的语言”。

在java软件开发当中,软件分析师/设计师负责设计类,java软件开发人员
必须要能看懂。

总结

除了以上的笔记之外,我自己补充总结一下。

如何自己写一个异常。

这个是比较经常用到的,首先两步
第一:继承
可以继承Exception编译时异常,也可以继承RunTimeException运行时异常
第二:构造方法
参考以下代码

public class AddWeaponException extends Exception{
    public AddWeaponException() {
    }

    public AddWeaponException(String message) {
        super(message);
    }
}

关于如何处理异常:

处理异常有两种办法,一种是try+catch 或者try+finally 或者try+catch+finally
将异常捕捉之后,进行处理。这是一种办法。

第二种办法,上抛,throws
上抛的目的,主要是为了让你的调用者知道你这里的异常需要处理,因此在编写代码的时候,调用方法的时候,需要对异常进行处理,不然的话无法通过。最好不要在main方法中抛上去,到时候抛给JVM可能会导致运行中止!

高级的异常处理

在我们一开始学习的时候,如果一个地方有错误,我们对此的处理可能就输出一句话System.out.println()一句话,什么什么错误,然后return;

这种方法其实是很low的,我们学会异常之后,要学会抛出这个异常,让调用者知道,我们这里可能会存在的异常,让调用者对这个异常进行处理!
比如就看以下的一段截取代码

    public void addWeapon(Weapon weapon) throws AddWeaponException {
        for (int i = 0; i <weapons.length ; i++) {
            if(weapons[i] == null){
                weapons[i] = weapon;
                System.out.println(weapon + "武器添加成功");
                return;
            }
        }
        throw new AddWeaponException("武器输量已达到上限");
    }

这里可能会存在武器数量过多,超过了我们初始化的数组的范围。
因此此时的时候,我们可以抛出一个异常,我们自己写的这个异常
(可以参考上面的那个如何自己写异常,就是我们上面的举例),
然后抛出之后,再上抛过去,让调用者来解决可能出现的这个异常情况。
可能是继续上抛,也可能是需要解决,看程序的具体业务需求。

使用异常,这是一种比sout更高级的处理方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值