当异常发生时,原本要接着执行的代码不再执行,转而让其他部分的代码来处理。如果没有代码负责处理,控制台会报告异常。

  异常出现时的执行机制

  异常机制最大的好处是:清晰地分开了 正常的业务逻辑遇到情况时的处理 代码。(当在业务逻辑中,有多步可能会抛出不同的异常时,异常处理机制的好处更得以体现。如果没有这种机制,也许会通过很多的if...else...来实现异常处理,甚至是多层嵌套的if...else...,这样的代码可读性很差)

  通过例子来理解:

package exception;

public class ExceptionCatch {
public static void main(String[] args) {
     try {
       //我们通过抛出异常来抽象真实的业务逻辑,可能某一步会出现异常,这时下面的代码就不再执行,转而到处理代码。
       //执行完处理代码之后不会再回到之前try里没执行完的代码继续执行,而是去往下执行try{}catch{}之后的代码。
throw new NullPointerException();
            throw new ArrayIndexOutOfBoundsException();
       throw ...                  
}catch(NullPointerException e) {
    //异常处理代码
}catch(ArrayIndexOutOfBoundsException e) {
       //异常处理代码
     }catch(Exception e){
       //异常处理代码
 }
}
}

  -----------------------------------------------------

  捕捉到异常之后怎么处理?

  当catch到异常之后,根据你的业务逻辑来对它进行处理,比如说可以弹出一个窗口来警告用户发生了错误,或者让程序自己重新执行或者终止掉等等。当然,如果现在处理不了这个异常,也可以将它再次抛出。

  处理完异常之后是回不到异常发生的地方继续执行以下的代码了,而是从catch{}后面的代码开始执行。

  一个异常只能被捕捉一次,捕捉之后这个异常就没有了。不可能再次捕捉到。

  -----------------------------------------------------

  自定义异常类的构造器getMessage()方法的使用 :

 package exception;

 //注意观察两个异常类构造器的区别。

  /**
  * 推断:
  * 第一个异常类是自己定义了一个String变量,在构造的时候是将信息传给了这个变量;
  * 而第二个异常类的构造器是覆盖了父类的构造方法,所以我们猜测,父类Exception里一定有一个String类型的成员变量(这个成员变量同样继承给了MyException子类),
  * 所以在构造的时候利用super()将父类的构造方法取过来,进而将信息传给了父类里的那个String成员变量。
  * 而getMessage()方法也是从父类那里继承来的,进而我们推断:getMessage()方法返回的正是那个String变量。
 * 在第一个异常类的那个从父类继承的String变量并没有被赋值,所以通过getMessage()取到的是null。
  */
 class MyException extends Exception {
String msg;
public MyException(String msg) {
this.msg = msg;
}
public void printMsg() {
System.out.println("msg = " + msg);
}
} class MyException2 extends Exception {
public MyException2(String s) {
super(s);
}
} public class E04_ExceptionClass {
public static void main(String args[]) {
try {
throw new MyException("MyException message");
} catch(MyException e) {
e.printMsg();
System.out.println("e.getMessage() = " + e.getMessage()); //输出为null。
} try {
throw new MyException2("MyException2 message");
} catch(MyException2 e) {
System.out.println("e.getMessage() = " + e.getMessage());
}
}
}
/*Output:msg = MyException message
* e.getMessage() = null
* e.getMessage() = MyException2 message
*/

  -----------------------------------------------------

  printStackTrace()方法:堆栈跟踪

  我们知道在程序代码执行的过程中,某个主线程可能会调用其他的代码程序,调用执行之后,回来继续执行主线程。这个过程中就需要堆栈来存储调用时的断点。(因为在嵌套调用的时候会需要存储多个断点,返回的时候再倒序依次返回,这要遵循后进先出的原则。)

  堆栈跟踪便可以看成是对代码调用的跟踪,当异常发生时可以根据该异常的printStackTrace()方法,打印出该异常的整个传递过程

  -----------------------------------------------------

  一个方法里如果会抛出异常,则必须在方法头部声明 throws 异常名 。如果不声明则必须在这个方法里通过 try{}catch{} 将异常处理掉。

  运行时刻的异常,如ArrayIndexOutOfBoundsException,NullPointerException等,不需要在方法头部声明。(Java核心技术里称这些未unchecked Exception,未检查异常。)

  一个方法可以声明多个异常抛出 throws 异常1 , 异常2 ,但是在以后调用该方法时必须有多个catch来捕捉不同的异常。温馨提示:往往在编程时,会把所有可能会有的异常(现在会有的和以后可能会有的)全都声明在方法之后,这是一种习惯。因为在后期在对该方法进行功能扩展时可能会遇到出现这些异常,而当时在声明这些异常之后编译器会提示你将这些异常一一catch,所以这时你只需要填补catch里的处理内容,这会来带一定的便利。

  下面是一个示例:

package exception;

class OpenException extends Throwable {}
class CloseException extends Throwable {} public class c {
public static int open() {
return -1;
} public static void readFile() throws OpenException,CloseException {
if(open() == -1) throw new OpenException();
} public static void main(String[] args) {
try {
readFile();
} catch (OpenException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (CloseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }

  -----------------------------------------------------

  异常捕捉时的匹配

  • 子类异常可以被捕捉父类异常的catch捕捉
  • 如果有多个匹配的异常,会按书写的顺序来,顺序里的第一个匹配的catch来捕捉。

  -----------------------------------------------------

  继承关系下异常的声明

  • 覆盖一个方法时,子类方法声明的异常版本不能比父类方法所声明的多。
  • 子类的构造函数中,必须声明父类声明可能抛出的全部异常。

Java基础学习 -- 异常的更多相关文章

  1. 尚学堂JAVA基础学习笔记

    目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...

  2. Java基础学习(3)

    Java基础学习(三) Java异常 Throwable类:所有异常的祖先类 Error:虚拟机异常.内存错误.没法处理 Exception:编码.环境.用户操作输入出现问题 非检查异常(自动捕获): ...

  3. Java基础学习-- 继承 的简单总结

    代码参考:Java基础学习小记--多态 为什么要引入继承? 还是做一个媒体库,里面可以放CD,可以放DVD.如果把CD和DVD做成两个没有联系的类的话,那么在管理这个媒体库的时候,要单独做一个添加CD ...

  4. Java基础学习中一些词语和语句的使用

    在Java基础学习中,我们刚接触Java会遇到一些词和语句的使用不清的情况,不能很清楚的理解它的运行效果会是怎么样的,如:break,continue在程序中运行效果及跳转位置, 1.先来看看brea ...

  5. Java基础学习笔记总结

    Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...

  6. 转载-java基础学习汇总

    共2页: 1 2 下一页  Java制作证书的工具keytool用法总结 孤傲苍狼 2014-06-24 11:03 阅读:25751 评论:3     Java基础学习总结——Java对象的序列化和 ...

  7. java基础学习总结——开篇

    java是我学习的第一门编程语言,当初学习java基础的时候下了不少功夫,趁着这段时间找工作之际,好好整理一下以前学习java基础时记录的笔记,当作是对java基础学习的一个总结吧,将每一个java的 ...

  8. Java基础学习笔记(一)

    Java基础学习笔记(一) Hello World 基础代码学习 代码编写基础结构 class :类,一个类即一个java代码,形成一个class文件,写于每个代码的前端(注意无大写字母) XxxYy ...

  9. java基础学习总结——java环境变量配置(转)

    只为成功找方法,不为失败找借口! 永不放弃,一切皆有可能!!! java基础学习总结——java环境变量配置 前言 学习java的第一步就要搭建java的学习环境,首先是要安装 JDK,JDK安装好之 ...

随机推荐

  1. Java三大框架 介绍

    三大框架:Struts+hibernate+spring Java三大框架主要用来做WEN应用. Struts主要负责表示层的显示 Spring利用它的IOC和AOP来处理控制业务(负责对数据库的操作 ...

  2. Spring注入JPA+JPA事务管理

    本例实现的是Spring注入JPA 和 使用JPA事务管理.JPA是sun公司开发的一项新的规范标准.在本质上来说,JPA可以看作是Hibernate的一个子集:然而从功能上来说,Hibernate是 ...

  3. Unix及类Unix系统文本编辑器的介绍

    概述 Vim是一个类似于Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性.VIM是纯粹的自由软件. Vim普遍被推崇为类Vi编辑器中最好的一个,事实上真正的劲敌来自Em ...

  4. SQL Server 跨网段(跨机房)复制

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搭建过程(Process) 注意事项(Attention) 参考 ...

  5. 苹果系统安装虚拟机 Mac如何安装虚拟机教程

    1.前言    大家在用 Mac 系统的时候,可能有时难免还是要用到 Windows 系统.在 Mac 上使用 Windows 系统有二种方法.一种是在 Mac上安装双系统,适合要在机器上处理一些大型 ...

  6. Rust初步(二):使用Visual Studio Code编写Rust程序(猜猜看游戏)

    我是照着下面这篇帮助文档,完成了第一个完整的Rust程序: 猜猜看 游戏 http://kaisery.gitbooks.io/rust-book-chinese/content/content/3. ...

  7. stm32控制电机

    一.总体思路       使用端口GPIOA来连接电机,所以给GPIOA编程就可以控制电机.使用系统时钟SysTick来周期性的给电机发送脉冲.用四个按钮来控制需要发送脉冲的个数,每个按钮被按下就设置 ...

  8. Cookie/Session机制详解

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...

  9. geotrellis使用(十二)再记录一次惨痛的伪BUG调试经历(数据导入以及读取瓦片)

    Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 BUG还原 查找BUG 解决方案 总结 后记 一.前 ...

  10. 【十大经典数据挖掘算法】Apriori

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 关联分析 关联分析是一类非常有 ...