Java基础复习笔记系列 三
前几节都是基础中的基础,从第三讲的笔记开始,每次笔记针对Java的一个知识块儿。
Java异常处理
1、什么是异常?
异常是指运行期出的错误。比如说:除以一个0;数组越界;读取的文件不存在。
异常处理,要把异常控制在程序员合理范围之内。如数组越界indexOutOfArray,在用户看来是不可以被理解的,所以,程序员要捕获这种异常,反馈到前端告诉用户是“超出了范围”。
Java中针对异常事件,自动生成一个异常对象。这个异常对象封装了异常事件的信息并将其提交给Java运行时系统。Java运行时系统会把异常对象中封装的异常事件信息打印到控制台上。我们所做的就是,在他交给Java运行时系统之前,捕获异常。那么问题来了,我们该怎么捕获异常呢?使用catch语句。如catch(ArithmeticException e)这个ArithmeticException异常时由Java运行时帮你生成的。catch什么时候被用,异常的时候用呗,要搭配try一起来用。如在微软产品中,系统现在出错,你是否愿意将这个错误报告给我们。
那么throws呢?throws是用在方法上的。throws说明用我这个方法可能出现的异常。如NullPointerException.
2、异常中的体系结构?
Throwable是一个根类。它下面有一个Exception类,一个Error类。Error是系统的内部错误,程序员管不了。Exception是程序员可以解决的异常。那么Exception类下面又分为RuntimeException类和非RuntimeException类。
RuntimeException可以不用catch;但是非RuntimeException必须得catch。在JDK的API中的方法后面throws的异常,都是非RuntimeException异常。如IOException。这些异常必须捕获。否则,程序无法运行。
printStackTrace,将可能引起异常的所有原因都打印出来了。从字面上看,就是所有Stack的轨迹。
总结:throwable-->Error
-->Exception-->RuntimeException
-->非RuntimeException(必须捕获)
比如说像:FileInputStream in = new FileInputStream("123.txt");这种语句在Eclipse中,如果不用try...catch语句来包裹的话,它的小红叉会提醒你:unhandled exception of FileNotFoundException.然后紧跟着在它的下面会提醒有:Add throws Declaration或者Surround with try/catch.可见,我们得出了结论。对于JDK API文档中的方法中throws的异常,必须要捕获。否则的话,程序有bug。
3、try包含的语句中可能有多个异常的时候,可以在后面搭配使用多个catch。
事情的逻辑是这样的:try...catch/catch/catch...finally.finally中的代码都会执行。也就是说,不管不产生异常,finally中的代码都会被执行。
为什么要引入这个机制呢?当catch住一个Exception的时候,程序就不会执行了。让finally中的语句不管什么状态都执行,保证了程序能正常的运行下去。finally为异常部分提供了一个统一的出口。finally一般用于资源的清除工作,如关闭打开的文件,删除临时文件。
4、对于处理不了的异常,怎么处理?
try...catch这种结构中,catch是用来捕获处理异常的结构。那么,如果我们处理不了的异常,怎么办呢?那就用到了另外一个关键字throws.
void function( )throws FileNotFoundException, IOException{ }这样,你只负责把这段代码的异常抛出。你只要往外抛就可以了,因为处理不了。那么,当别的函数要调用的时候,那么就要写try...catch了或者在接着用throws异常。
但是,最终异常一定要被处理,不能再程序中自己吞掉。这样程序还怎么进行维护?e.printStackTrace()(把它的所有的堆栈的信息都打印出来)或者用log4J将它记录在日志文档中。
最屌丝的做法就是在public static void main方法上用throws来抛异常,这样将异常交给了Java运行时系统。异常是程序员应该做的事,教给Java运行时系统做事很不好的编程习惯。
5、知识补充待续:
异常处理的函数,要被另外一个函数所调用。它们可以一级一级的使用throws来抛异常,不处理异常,但是最终的最终,都必须要用try...catch来捕获处理异常,而千万不能把它们交给Java运行时系统来处理。
我们在调试代码的时候,比如数组越界一个错误,在控制台上,会看到抛出了一系列的错误。它们都是基于e.printStackTrace来打印出的异常。而且因为它们各级之间都是用throws来抛异常,不处理异常,所以,才会,一个bug,会把栈空间的所有exception打印出来。因为你要知道,在Java的API中,好多函数也仅仅是throws异常,而不处理。这个时候,要关注at...(Test.java 18),关注at后面的内容,提示了哪个文件中的第几行出错了。
6、catch的时候,要注意一下catch的顺序问题。
首先捕小的,子类的异常。再捕获大的,如Exception异常。假如先捕获了Exception异常,那么后面的异常就不可能再被捕获到了。
异常抛出之后,try中剩余的部分是不会被执行的。
重写方法,需要跟原方法抛出一模一样的异常,不能大,不能小。但是你可以不用写throws。切记!
7、自定义异常?
自定义异常,自己生成自己的异常类。你只要继承Exception或者继承RuntimeException就可以了。如:登陆网页的时候,我们自定义异常,user Not found异常;或者password is uncorrect异常。
异常写的精细点儿,就是用户名错误,或密码错误,或校验码错误。写的粗糙,就是错误。很显然,第一种异常是一种比较好的效果。
Java基础复习笔记系列 三的更多相关文章
- Java基础复习笔记系列 八 多线程编程
Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...
- Java基础复习笔记系列 九 网络编程
Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...
- Java基础复习笔记系列 七 IO操作
Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...
- Java基础复习笔记系列 五 常用类
Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...
- Java基础复习笔记系列 四 数组
Java基础复习笔记系列之 数组 1.数组初步介绍? Java中的数组是引用类型,不可以直接分配在栈上.不同于C(在Java中,除了基础数据类型外,所有的类型都是引用类型.) Java中的数组在申明时 ...
- Java基础复习笔记系列 二
1.Java中Static的相关用法总结?(静态方法:静态变量:静态代码块) public static void main(String args[])执行的关键,在于有static.有了stati ...
- Java基础复习笔记系列 十三 反射机制
主题:Java反射机制 学习资料参考网址: 1.http://www.icoolxue.com 1.Java反射机制. 各种框架中都使用到了Java的反射机制. 两个类:java.lang.Class ...
- Java基础复习笔记基本排序算法
Java基础复习笔记基本排序算法 1. 排序 排序是一个历来都是很多算法家热衷的领域,到现在还有很多数学家兼计算机专家还在研究.而排序是计算机程序开发中常用的一种操作.为何需要排序呢.我们在所有的系统 ...
- Java基础知识笔记(三:文件与数据流)
一.输入流与输出流 输入流将数据从文件.标准输入或其他外部输入设备中加载到内存.输出流的作用则刚好相反,即将在内存中的数据保存到文件中,或传输给输出设备.输入流在Java语言中对应于抽象类java.i ...
随机推荐
- Atitit Server Side Include ssi服务端包含规范 csi esi
Atitit Server Side Include ssi服务端包含规范 csi esi 一.CSI (Client Side Includes) 1 1.1. 客户端包含1 1.2. Ang ...
- Atitit usrqbg1834 html的逻辑化流程化 规范标准化解决方案
Atitit usrqbg1834 html的逻辑化流程化 规范标准化解决方案 常用指令1 ..v-if.v-else指令2 v-for指令3 MVVM大比拼4 常用指令 本来按照Vue文档说明,常用 ...
- Python中的运算符
说完常用的数据类型,再来说下运算符.运算符用于将各种类型的数据进行运算,让静态的数据跑起来. 编程语言中的运算大致分为以下几个大类: 算术运算, 用于加减乘除等数学运算 赋值运算,用于接收运算符或方法 ...
- iReport 开发和运行所用版本不一致导致设置字体大小不起作用
问题:开发环境使用 Win10 + iReport 5.6 ,运行环境使用 Win10 + iReport 5.2 ,设置字体的大小不起作用. 解决方法:开发环境和运行环境一致,都使用 iReport ...
- 对HTML5新增JS Api的思考
1.为什么javascript的变量名不使用css中的命名方法,而选择使用驼峰命名法 因为在javascript中“-”表示减法,所以如果使用“-”的话会出现不必要的问题. 2.在javascript ...
- CSS背景100%平铺 浏览器缩小背景显示不全解决办法
本文我们分享前端CSS背景100%平铺,浏览器缩小背景显示不全bug解决的两个方法,如果你也遇到了,那么就可以参考下面文章. 把浏览器的窗口缩小时,拖动滚动条时你会发现原本设定的CSS背景100%平铺 ...
- java中多线程模拟(多生产,多消费,Lock实现同步锁,替代synchronized同步代码块)
import java.util.concurrent.locks.*; class DuckMsg{ int size;//烤鸭的大小 String id;//烤鸭的厂家和标号 DuckMsg(){ ...
- Angular从0到1:function(下)
1.前言 2.function(下) 2.13.angular.isArray(★★) angular.isArray用于判断对象是不是数组,等价于Array.isArray console.log( ...
- hash算法总结收集
hash算法的意义在于提供了一种快速存取数据的方法,它用一种算法建立键值与真实值之间的对应关系,(每一个真实值只能有一个键值,但是一个键值可以对应多个真实值),这样可以快速在数组等条件中里面存取数据. ...
- 轻松自动化---selenium-webdriver(python) (十一)
本节重点: 控制滚动条到底部 有时候我们需要控制页面滚动条上的滚动条,但滚动条并非页面上的元素,这个时候就需要借助js是来进行操作.一般用到操作滚动条的会两个场景: 注册时的法律条文需要阅读,判断用户 ...