为什么你的软件编译时没问题,运行时却出错?—— Java 中的异常再复盘

从开发工具谈起:

这是我平常用的几个编辑器。记得我刚开始学 C 语言,学 Java 的时候,还是用 Notepad++ 这种文本编辑器写代码,老师说是为了打基础,加深记忆。后来做开发,开始接触一些开发工具,什么 Dev C++,Eclipse,VS 还有 AndroidStudio 啥的,刚开始用的时候就觉得这些工具太神奇了,不光是组织你的工程文件,更是在你编写代码的时候帮你检查错误。我相信,代码自动补全和纠错一定是一个开发者最常用到的功能。不过,我想你也一定不建议编程初学者在学习的时候就使用这种东西,因为功能实在是太好用了!(以至于不怎么需要动脑很多工作就自动完成了)

尽管当时觉得神奇,但是现在的我明白的:开发工具里的纠错机制,正是来源于 Java 里对异常的判断。编译通过的软件运行却崩溃,也与它有关。借着还是初学者时的提问,今天再来把这个基础知识复习一下

——————————————

1.异常概述


学过 Java 的小伙伴们应该都知道,在 Java 里,异常主要分两种:Error (错误)和 Exception (例外),它们都继承自 Throwable 类。也就是说 Java 中所有的异常处理机制都来源于这个类。两个子类的区别非常好判断,其实只要看名字就能知道:Error,表示“错误”,尤其是指那些比较严重的错误,比如保存文件时磁盘空间已满。这种情况已经构成了代码运行中彻彻底底的“错误”,而并非修改代码就能解决的,所以作为开发者不必解决,只需要妥善地退出并弹出友好的提示即可。Exception 表示“例外”,这两个字表示的含义很明确:一般没事——只要你能按“规矩”使用/编写软件。这类异常是开发者所需要关心的。

2.代码中的异常

忘加分号、未定义变量之类的错误,开发工具都能在编写时检查出来,这类代码中的问题如果不解决,就无法通过编译,被称为编译时异常。而如果代码通过了编译,软件开始运行后发生的错误则被成为运行时异常(RuntimeException)。比如在计算器软件中让 0 作为除数,开发者应该处理这样的“例外”。这是 Exception 类里包涵的两类情况。有一个简单的判别方法:如果一个类继承自 RuntimeException 类,就是运行时异常;如果直接继承自 Exception 就是编译时异常。

3.如何处理异常

首先应该想一下,为什么我们非要去处理异常?如果不去处理的话又会发生什么?

在 Eclipse 输入了以下代码:

运行后的控制台输出:

显然,程序会报错。更重要的是程序会直接中断(在没有提示,更没有安全措施的情况下),这才是开发者需要妥善处理异常的原因。

解决方法:很简单,为了使得可能出现的异常得到处理并且程序不会中断,代码有两种编写方式,一种是 try...catch...finally组织代码,另一种 throw/throws (直接抛出给调用者)。基本的用法我想大家都会用,我就不多说了,忘了的话稍微查一下书即可。值得注意的是,我看过一些视频教程里的老师为了图方便,在演示时把可能存在问题的大段代码(并不是每行代码都涉及异常)都用 try 给包住,然后直接只 catch 一个“Exception“。在课堂上这样节省时间无可厚非,但是开发时最好不要这样图方便。软件运行时,Java 虚拟机遇到 try 就进入了异常处理机制,会预留计算机资源来应对可能出现的异常。”try“ 里包含的代码越多,可能涉及的异常种类就越多,就会在运行时占用更多资源(而并没有真正使用),造成浪费。所以 try 结构里的代码越少越好。当 try{} 里的代码出现异常时,虚拟机会创建一个 Exception 对象与 catch 里的 Exception 参数进行匹配,然后运行对应catch里的代码。

“throws ”跟在方法名之后,表示将可能出现的异常抛出,更多地只是一种标记,而 “throw”是一个具体的动作 —— 抛出一个异常对象。

——————————————

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值