首先有件事要和大家说一下:我的公众号现在可以留言了!
出于种种不可抗力的原因(你们懂的),2018 年 3 月 12 号之后注册的公众号将不带有留言功能,并且前三个月内注册但并未使用的公众号的留言功能也会被一并回收,所以我这个号注册时就没有留言了。最近我发现了可以用于留言的小程序,所以就借着这篇文章试验一下这种留言功能。希望看到这篇文章的小伙伴们能够给我留个言,我会一一回复的。
从开发工具谈起:
这是我平常用的几个编辑器。记得我刚开始学 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”是一个具体的动作 —— 抛出一个异常对象。
好的,有关异常的内容就先写到这,但还没完。未来几天我会再把 IO 方面的内容复盘一下,涉及异常的会一并补充。
谢谢你能读到这里,欢迎留言讨论!