异常处理机制

异常处理是对可能出现的异常进行处理,以防止程序遇到异常时被卡死,处于一直等待,或死循环。

异常有两个过程,一个是抛出异常;一个是捕捉异常。

抛出异常

抛出异常有三种形式,一是throw,一个throws,还有一种系统自动抛异常。下面它们之间的异同。

系统自动抛异常

当程序语句出现一些逻辑错误、主义错误或类型转换错误时,系统会自动抛出异常。如:

  1. public static void main(String[] args) {
  2. int a = 5, b =0;
  3. System.out.println(5/b);
  4. //function();
  5. }

系统会自动抛出ArithmeticException异常:

Exception in thread "main" java.lang.ArithmeticException: / by zero

at test.ExceptionTest.main(ExceptionTest.java:62)

再如

  1. public static void main(String[] args) {
  2. String s = "abc";
  3. System.out.println(Double.parseDouble(s));
  4. //function();
  5. }

系统会自动抛出NumberFormatException异常:

Exception in thread "main" java.lang.NumberFormatException: For input string: "abc"

at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224)

at java.lang.Double.parseDouble(Double.java:510)

at test.ExceptionTest.main(ExceptionTest.java:62)

throw

throw是语句抛出一个异常。
语法:throw (异常对象);
      如:  throw e;

一般会用于程序出现某种逻辑时程序员主动抛出某种特定类型的异常。如:

  1. public static void main(String[] args) {
  2. String s = "abc";
  3. if(s.equals("abc")) {
  4. throw new NumberFormatException();
  5. } else {
  6. System.out.println(s);
  7. }
  8. //function();
  9. }

会抛出异常:

Exception in thread "main" java.lang.NumberFormatException

at test.ExceptionTest.main(ExceptionTest.java:67)

throws

throws是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常)
语法:[(修饰符)](返回值类型)(方法名)([参数列表])[throws(异常类)]{......}
      如:      public void function() throws Exception{......}

当某个方法可能会抛出某种异常时用于throws 声明可能抛出的异常,然后交给上层调用它的方法程序处理。如:

  1. public static void function() throws NumberFormatException{
  2. String s = "abc";
  3. System.out.println(Double.parseDouble(s));
  4. }
  5.  
  6. public static void main(String[] args) {
  7. try {
  8. function();
  9. } catch (NumberFormatException e) {
  10. System.err.println("非数据类型不能转换。");
  11. //e.printStackTrace();
  12. }
  13. }

处理结果如下:

非数据类型不能转换。

throw与throws的比较

1、throws出现在方法函数头;而throw出现在函数体。

2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。

3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

好的编程习惯:

1.在写程序时,对可能会出现异常的部分通常要用try{...}catch{...}去捕捉它并对它进行处理;

2.用try{...}catch{...}捕捉了异常之后一定要对在catch{...}中对其进行处理,那怕是最简单的一句输出语句,或栈输入e.printStackTrace();

3.如果是捕捉IO输入输出流中的异常,一定要在try{...}catch{...}后加finally{...}把输入输出流关闭;

4.如果在函数体内用throw抛出了某种异常,最好要在函数名中加throws抛异常声明,然后交给调用它的上层函数进行处理。

捕捉异常

先讲捕捉异常

  1. try{
  2.  ……
  3. }catch(Exception e){
  4.  ……
  5. }finally{
  6.  ……
  7. }

try{……}中放置可能会发生异常的的语句块,如可能出现异常的函数,也可以是一般的程序语句;catch(){……}用于抓住异常,(Exception e)中Exception是异常的类型,必须是Exception(Exception是所有异常类的父类)的子类。{}定义当出现异常时的处理方法。finally{……}表示不管异常是否发生,都得进行finally{}中的处理。

在捕捉异常的try{...}语句块中,如果出现了异常,则该语句(出现异常的语句)后的程序语句都不执行,而是跳到catch{...}语句块中执行异常的处理。如:

  1. public static void function1() throws NumberFormatException{
  2. System.out.println(Double.parseDouble("abc"));
  3. System.out.println("第二条语句。");
  4.  
  5. }
  6.  
  7. public static void main(String[] args) {
  8. try {
  9. function1();
  10. } catch (Exception e) {
  11. System.err.println(e.getMessage());
  12. //e.printStackTrace();
  13. }
  14. }

结果如下,只输出了一条错误提示语:

For input string: "abc"

System.out.println("第二条语句。");未执行。

如果一个函数没有用throws进行抛异常,在调用该函数的方法也同样可以捕捉异常。如

  1. public static void function() {
  2. String s = "abc";
  3. System.out.println(Double.parseDouble(s));
  4. }
  5.  
  6. public static void main(String[] args) {
  7. try {
  8. function();
  9. } catch (Exception e) {
  10. System.err.println("非数据类型不能转换。");
  11. //e.printStackTrace();
  12. }
  13. }

处理结果如下:

非数据类型不能转换。

说明:某个函数或某段程序块不管会不会,有没可能抛出异常,都可以加try{...}catch{...}去捕捉它。

自定义异常

用户可以自定义异常,新建一个异常类,让其继承Exception类或Exception的某个子类。然后用throw抛出自己定义的异常类对象。如:

  1. public static void function() throws ParenthesisMatchingException{
  2. String s = "((a+b)";
  3. ParenthesisMatchingException e = new ParenthesisMatchingException("括号匹配异常!");
  4. if(s.charAt(0)=='(' && s.charAt(1)=='(') {
  5. throw e;
  6. }
  7. System.out.println(s);
  8. }
  9.  
  10. public static void main(String[] args) {
  11. try {
  12. function();
  13. } catch (Exception e) {
  14. System.out.println(e.getMessage());
  15. //e.printStackTrace();
  16. }
  17. }

结果如下 :

  括号匹配异常!

【Java学习笔记之三十二】浅谈Java中throw与throws的用法及异常抛出处理机制剖析的更多相关文章

  1. 【Java学习笔记之三十】详解Java单例(Singleton)模式

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

  2. Java学习笔记(十二):java编译跨平台运行原理

    class文件由java源代码通过javac编译器编译生成,只能为JVM所识别.

  3. 【Java学习笔记之三十三】详解Java中try,catch,finally的用法及分析

    这一篇我们将会介绍java中try,catch,finally的用法 以下先给出try,catch用法: try { //需要被检测的异常代码 } catch(Exception e) { //异常处 ...

  4. 【Java学习笔记之三十四】超详解Java多线程基础

    前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...

  5. Java学习笔记【十二、网络编程】

    原计划的学习结束时间是3月4日,目前看来已经延迟了,距离低标还差一些,多方面原因,也不找借口,利用周末赶赶进度,争取本周末把低标完成吧! 参考: http://www.runoob.com/java/ ...

  6. 【Java学习笔记之十二】Java8增强的工具类:Arrays的用法整理总结

    本文将整理 java.util.Arrays 工具类比较常用的方法:  本文介绍的方法基于JDK 1.7 之上.  1.  asList方法 @SafeVarargs public static &l ...

  7. Java学习笔记(十二)——eclipse和SVN配置,导入SVN服务器项目

    [前面的话] 北京的天气外加自己的不小心终于病了,在病的过程中,感觉身体好着真好,可以学习,可以吃好吃的,可以去运动,这一病了,干什么都感觉没有力气,身体好着真好. 这个文章的背景是:领导把项目最开始 ...

  8. shell编程学习笔记(十二):Shell中的break/continue跳出循环

    在循环遍历中,可以添加对应判断条件跳出循环,跳出循环可以使用break/continue,这个跟java语言是一样的,break是指跳出整个循环,continue是指跳出当前循环体,继续下一项循环. ...

  9. Java学习笔记(十四):java常用的包

随机推荐

  1. iOS开发实战-时光记账Demo 网络版

    之前写了一个本地数据库版本 戳这里 现在这个就是增加了后台 登录注册页面以及web的上传记录展示页面 含有少量php有兴趣可以看下 另外demo中包括数据库操作.json.网络请求等都没有用到第三方库 ...

  2. [JAVASCRIPT]实现页面复制至电脑剪贴板

    一. 方法 方1: window.clipboarddata  可惜不支持chrome , chrome 下会提示找不到 clipboarddata 对象 方2: 采用国外大牛写的ZeroClipbo ...

  3. 【HTML】DocType

    一.docType是什么 <!DOCTYPE> 声明不是 HTML 标签:它是指示 web 浏览器关于页面使用哪个 HTML 版本进行编写的指令. 在 HTML 4.01 中,<!D ...

  4. Python-cookies

    附新手工具: python新手工具下载链接:http://pan.baidu.com/s/1eS8WMR4 密码:7eso 注册码:http://idea.liyang.io py和编辑器安装教程链接 ...

  5. JAVA基础2----数据类型和运算符

    Java数据类型 1.基本数据类型 整数:byte/short/int/long byte:-128~127 (1个字节) short:-2^15~2^15-1 (2个字节) int(默认类型):-2 ...

  6. 表达式求值(二叉树方法/C++语言描述)(五)

    本例中的二叉树图是使用Graphviz绘制的(Graphviz官网),在Ubuntu Linux下可以使用apt-get命令安装它: sudo apt-get install graphviz 表达式 ...

  7. 表达式求值(二叉树方法/C++语言描述)(一)

    使用二叉树对算数表达式(以下简称为表达式)进行求值,实质上是将表达式转换为二叉树,对其进行后序遍历,得到后缀表达式的同时可以求得表达式的值.转换和求值的过程也需要借助数据结构栈的帮助. 二叉树数据结构 ...

  8. Tornado 判断用户登录状态和操作权限(装饰器)

    判断是否登录: def authenticated(method): '''''' @functools.wraps(method) def wrapper(self, *args, **kwargs ...

  9. Aspose.Words关于域的应用

    #region 通过word域去插入相应的数据 /// <summary> /// 通过word域去进行指定位置替换数据 /// </summary> public void ...

  10. Selenium+java操作浏览器cookies

    描述:登录CSDN,将登录信息cookies保存到文件,再次打开网页时,直接利用文件中的数据登录. 1. 获取cookies并保存到文件 步骤: ① 打开CSDN的登录界面: ② 填写用户名和密码: ...