1.异常处理的越早,损失越小

2.在一些传统的编程语言中,如C语言中,没有专门处理异常的机制,程序员通常用方法的特定返回值来表示异常情况。Java语言按照面向对象的思想来处理异常,使得程序具有更好的可维护性,Java语言处理异常具有以下优点:

>把各种不同类型的异常情况进行分类,用Java类来表示异常情况,这种类被称为异常类。把异常情况表示成异常类,可以充分发挥类的可扩展和可重用的优势

>异常流程的代码和正常流程的代码分离,提高了程序的可读性,简化了程序结构

>可以灵活的处理异常,如果当前方法有能力处理异常,就捕获并处理他,否则就只需要抛出异常,由方法调用者来处理

3.Java虚拟机的方法调用栈

每个线程都有一个独立的方法调用栈。对于Java应用程序的主线程,堆栈底部是程序的入口方法main(),当一个新的方法被调用时,Java虚拟机把描述改方法的栈结构置入栈顶,位于栈顶的方法为正在执行的方法。方法的调用顺序为:main()方法调用mathodB()方法,methodB()方法调用methodA()方法。

当一个方法正常执行完毕,Java虚拟机会从调用栈中弹出改方法的栈结构,然后继续处理前一个方法。如果在执行方法的过程中抛出异常,则Java虚拟机必须找到能捕获该异常的catch代码块。他首先检查看当前方法是否存在这样的catch代码块,若果存在就执行该catch代码块,否则Java虚拟机会从调用栈中弹出该方法的栈结构继续到前一个方法中查找合适的catch代码块。在回溯的过程中,若果Java虚拟机在某个方法中找到了处理改异常的代码块,则该方法的栈结构将成为栈顶元素,程序流程将转到改方法的异常处理代码部分继续执行。

当Java虚拟机追溯到调用栈的底部的方法时,如果仍没有找到处理改异常的代码块,将按照以下步骤处理

(1)调用异常对象的printStackTrace()方法,打印来自方法调用栈的异常信息,

(2)如果该线程不是主线程,那么终止这个线程,其他线程继续正常执行,如果该线程是主线程(即方法调用栈的底部为main()方法),那么整个应用程序终止。

public class MainCatcher {public void methodA(int money) throws SpecialException{if(--money <= 0){throw new SpecialException("Out of money");}System.out.println("methodA");}public void methodB(int money) throws SpecialException{methodA(money);System.out.println("MethodB");}public static void main(String[] args) throws SpecialException {new MainCatcher().methodB(1);}
}class SpecialException extends Exception{public SpecialException() {super();// TODO Auto-generated constructor stub}public SpecialException(String message) {super(message);// TODO Auto-generated constructor stub}
}

打印的结果是

Exception in thread "main" com.gao.exception.SpecialException: Out of money
at com.gao.exception.MainCatcher.methodA(MainCatcher.java:10)
at com.gao.exception.MainCatcher.methodB(MainCatcher.java:16)
at com.gao.exception.MainCatcher.main(MainCatcher.java:21)
如果改成

public static void main(String[] args) throws SpecialException {//new MainCatcher().methodB(1);try {new MainCatcher().methodB(1);System.out.println("mian");} catch (SpecialException e) {System.out.println("Wrong");}}

打印的结果是Wrong
如果new MainCatcher().methodB(2);

methodA
MethodB
mian

4.throws:生命可能会抛出的异常

如果一个方法可能会抛出异常,但是没有能力处理这种异常,可以在方法声明处使用throws字句来声明抛出异常。例如汽车在运行时可能会出现故障,汽车本身没有办法处理这个故障,因此Car()类的run()方法声明抛出CarWrongException。

Worker类的gotoWork()方法调用以上run()方法,gotoWork()方法捕获并处理CarWrongException异常,在异常处理过程中又生出新的异常LateException,gotoWork()方法本身不会再处理LateException而是声明抛出LateException。谁回来处理Worker类的LateException呢?显然是职工老板,如果某职工上班迟到,那么就扣他的工资。

public class Worker {private Car car;public Worker(Car car) {super();this.car = car;}public void gotoWork() throws LateException {try {car.run();} catch (CarWrongException e) {walk();Date date = new Date(System.currentTimeMillis());String reason = e.getMessage();throw new LateException(date, reason);}}private void walk() {// TODO Auto-generated method stub}public static void main(String[] args) {}}class Car{public void run() throws CarWrongException{if(true/*车子无法刹车*/){throw new CarWrongException("车子无法刹车");}if(true/*发动机无法启动*/){throw new CarWrongException("发动机无法启动");}}
}class CarWrongException extends Exception{public CarWrongException() {super();// TODO Auto-generated constructor stub}public CarWrongException(String message) {super(message);// TODO Auto-generated constructor stub}
}class LateException extends Exception{private Date arriveTime;private String reason;public LateException(Date arriveTime, String reason) {super();this.arriveTime = arriveTime;this.reason = reason;}public Date getArriveTime() {return arriveTime;}public String getReason() {return reason;}
}

Java异常处理 一相关推荐

  1. Java异常处理12条军规

    摘要: 简单实用的建议. 原文:Java异常处理12条军规 公众号:Spring源码解析 Fundebug经授权转载,版权归原作者所有. 在Java语言中,异常从使用方式上可以分为两大类: Check ...

  2. Java 异常处理的 9 个最佳实践

    Java 异常处理的 9 个最佳实践 原文地址:https://dzone.com/articles/9-... 翻译出处:https://www.oschina.net/trans... 在 Jav ...

  3. 《转载》Java异常处理的10个最佳实践

    本文转载自 ImportNew - 挖坑的张师傅 异常处理在编写健壮的 Java 应用中扮演着非常重要的角色.异常处理并不是功能性需求,它需要优雅地处理任何错误情况,比如资源不可用.非法的输入.nul ...

  4. java异常处理之throw, throws,try和catch

    转自 http://blog.csdn.net/zhouyong80/article/details/1907799  程序运行过程中可能会出现异常情况,比如被0除.对负数计算平方根等,还有可能会出现 ...

  5. java提供两种处理异常的机制_浅析Java异常处理机制

    关于异常处理的文章已有相当的篇幅,本文简单总结了Java的异常处理机制,并结合代码分析了一些异常处理的最佳实践,对异常的性能开销进行了简单分析. 博客另一篇文章<[译]Java异常处理的最佳实践 ...

  6. java 异常处理

    一.动手动脑 运行AboutException.java示例,了解Java中实现异常处理的基础知识. 1)源代码 import javax.swing.*;classAboutException {p ...

  7. java异常处理机制详解

    java异常处理机制详解 参考文章: (1)java异常处理机制详解 (2)https://www.cnblogs.com/vaejava/articles/6668809.html 备忘一下.

  8. java异常处理试题答案_Java 面试题和答案 - (下)

    第一篇讨论了面向对象编程和它的特点,关于Java和它的功能的常见问题,Java的集合类,垃圾收集器,本章主要讨论异常处理,Java小应用程序,Swing,JDBC,远程方法调用(RMI),Servle ...

  9. 简述java异常处理机制

    引言: Hello,我的好朋友们,又到我们相聚的时间了,今天我要和大家分享一些有关java异常处理的相关 知识,也是通过老师的讲解和相关材料的借鉴之后的一个比较系统的总结,真心希望写完这篇文章的我和看 ...

  10. Java异常处理及异常机制介绍

    Java异常处理及异常机制介绍 当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用...)时,JAVA就会用异常对象来描述. JAVA中用2种方法处理异常: 1.在发生异 ...

最新文章

  1. Android-PullLayout
  2. 搭建本地Yum软件源安装Cloudera Manager 5
  3. 每日一笑 | 马冬梅当上了百度投资董事???
  4. python数据结构算法优势_Python数据结构与算法(一)----- 算法效率
  5. linux磁盘管理不用LVM,[linux] LVM磁盘管理(针对xfs和ext4不同文件系统)
  6. 镜像的使用(6-13)
  7. 25. PHP 文件处理
  8. 类的虚函数表和虚函数在内存中的位置
  9. Linux中权威域名服务器,请在(7)~(9)处填写恰当的内容。在Linux系统中配置域名服务器,该服务..._考试资料网...
  10. Android 系统签名(.pk8、.pem) 制作成 storeFile
  11. 我们写APP和小程序或者H5用的前端UI--ColorUI
  12. Java语言背景介绍
  13. 2.5数字传输系统2.6宽带接入技术
  14. 织梦DedeCms网站更换域名后文章图片路径批量修改
  15. 置信区间用计算机如何计算,置信区间计算器
  16. 建Kangle+EasyPanel对接SWAP IDC虚拟主机自助开通完整教程
  17. 【转】一生必看的成功学书(转载)
  18. 【CV系列】图像算法之一:Randon变换
  19. Linkerd 2.10(Step by Step)—设置服务配置文件
  20. android中出现javax.net.ssl.SSLPeerUnverifiedException的解决方案

热门文章

  1. BCG菜单button的简单使用
  2. 简记:我的Scala学习之路
  3. NetofficeSystem协同办公系统今日发布
  4. MySQL 的CASE WHEN 语句使用说明
  5. NodeJS 加密 —— crypto 模块
  6. 【LeetCode题解】二叉树的遍历
  7. 使用Xshell密钥认证远程登录linux
  8. 将摄像头拍摄图像或者本地图片设置为头像的方法
  9. Proxmox VE2.2虚拟化安装配置学习笔记(三)
  10. Lync Server 2010企业版系列PART1:基础构建