前几节都是基础中的基础,从第三讲的笔记开始,每次笔记针对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基础复习笔记系列 三的更多相关文章

  1. Java基础复习笔记系列 八 多线程编程

    Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...

  2. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

  3. Java基础复习笔记系列 七 IO操作

    Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...

  4. Java基础复习笔记系列 五 常用类

    Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...

  5. Java基础复习笔记系列 四 数组

    Java基础复习笔记系列之 数组 1.数组初步介绍? Java中的数组是引用类型,不可以直接分配在栈上.不同于C(在Java中,除了基础数据类型外,所有的类型都是引用类型.) Java中的数组在申明时 ...

  6. Java基础复习笔记系列 二

    1.Java中Static的相关用法总结?(静态方法:静态变量:静态代码块) public static void main(String args[])执行的关键,在于有static.有了stati ...

  7. Java基础复习笔记系列 十三 反射机制

    主题:Java反射机制 学习资料参考网址: 1.http://www.icoolxue.com 1.Java反射机制. 各种框架中都使用到了Java的反射机制. 两个类:java.lang.Class ...

  8. Java基础复习笔记基本排序算法

    Java基础复习笔记基本排序算法 1. 排序 排序是一个历来都是很多算法家热衷的领域,到现在还有很多数学家兼计算机专家还在研究.而排序是计算机程序开发中常用的一种操作.为何需要排序呢.我们在所有的系统 ...

  9. Java基础知识笔记(三:文件与数据流)

    一.输入流与输出流 输入流将数据从文件.标准输入或其他外部输入设备中加载到内存.输出流的作用则刚好相反,即将在内存中的数据保存到文件中,或传输给输出设备.输入流在Java语言中对应于抽象类java.i ...

随机推荐

  1. eclipse导入cordova项目

    eclipse导入cordova项目 导入老是出问题是不是?老是提议已存在是不是? 不知道如何改名字? 这里关键的一点是一定要选择对应的platform的目录,而不是你的项目的目录,不是你的项目的目录 ...

  2. vm中centos7配置静态ip访问外网

    我使用的是桥接方式,具体步骤如下   1.设置虚拟机网络: 编辑>虚拟网络编辑器   2.设置vm中操作系统的网络设置   3.进入centos7中后修改网络配置:     另附我的宿主机网络配 ...

  3. 快速入门系列--WebAPI--01基础

    ASP.NET MVC和WebAPI已经是.NET Web部分的主流,刚开始时两个公用同一个管道,之后为了更加的轻量化(WebAPI是对WCF Restful的轻量化),WebAPI使用了新的管道,因 ...

  4. javascript运算符——位运算符

    × 目录 [1]二进制 [2]非 [3]与[4]或[5]异或[6]左移[7]右移[8]>>>[9]应用 前面的话 位运算符是非常底层的运算,由于其很不直观,所以并不常用.但是,其速度 ...

  5. AngularJs单元测试

    这篇文章主要介绍了angularJS中的单元测试实例,本文主要介绍利用Karma和Jasmine来进行ng模块的单元测试,并用Istanbul  来生成代码覆盖率测试报告,需要的朋友们可以参考下,以下 ...

  6. Cocos2d-x 3.2 学习笔记(十三)CocoStudio UI编辑器 by 保卫萝卜

    关于编辑器部分研究的不多,但基本能使用.最近时间不是很多,因此写blog的次数越来越少了.自从玩了<保卫萝卜>时候一直想要写一下,同时练下手感.基本的结构已经写的差不多了,主要完善写UI和 ...

  7. [c++] Iterators

    性质depends on various containers. 需要躲过的坑,野指针. int main() { cout << "Hello World!" < ...

  8. 轻松自动化---selenium-webdriver(python) (七)

    本节知识点: 多层框架或窗口的定位: switch_to_frame() switch_to_window() 智能等待: implicitly_wait() 对于一个现代的web应用,经常会出现框架 ...

  9. CSS3 Animation Cheat Sheet:实用的 CSS3 动画库

    CSS3 Animation Cheat Sheet 是一组预设的动画库,为您的 Web 项目添加各种很炫的动画.所有你需要做的是添加样式表到你的网站,为你想要添加动画效果的元素应用预制的 CSS 类 ...

  10. KafkaConfig介绍

    public class KafkaConfig implements Serializable { /** 一个借口,实现类有ZkHosts,和StatisHosts **/ public fina ...