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. iOS推送:要支持戴口罩解锁了!以为是黑科技,原来是骗我买iWatch...
  2. python读取文件某一行-python计算文件的行数和读取某一行内容的实现方法
  3. HTTPS访问站点,出现证书问题解决
  4. [bzoj 4887] [Tjoi2017]可乐
  5. 1.2 String字符串和整型int的相互转换,valueOf() 、parse()和toString()
  6. python语言表白语句简单_简短的表白语句
  7. [转载] python学习笔记
  8. unity2D相机跟随
  9. linux内核中union,Linux上的Union mount
  10. MongoDB数据库设计中6条重要的经验法则,part 2
  11. css实训内容,实训五DivCSS布局基本.doc
  12. 根据主题不同,引用不同的资源文件
  13. HAV-down1.1vs 大黄峰资源搜索 绿色特别版
  14. Redis入门完整教程:CacheCloud用户功能
  15. [iOS,mac]Coding.Net(码市)进行代码管理
  16. 如何创建一个网站?初学者的分步指南
  17. 关于FS4412的ARM开发环境搭建并点亮LED灯
  18. 使用openCV进行边缘检测、二值化、轮廓、轮廓检测、BGR、灰度图、二值化,专栏:各种openCV实践的案例
  19. 解决苹果手机点击输入框页面自动放大问题
  20. visdom TensorboardX进行可视化-包括对高维特征可视化(T-SNE PCA等)

热门文章

  1. Memcache监控工具 -- memkeys
  2. MFC避免窗口闪烁的方法(OnEraseBkgnd) .
  3. 强制更新LYNC客户端的地址簿
  4. 静态路由实现负载均衡和高可用
  5. lighttpd 之防盗链
  6. Android下查看共享库依赖项
  7. MYSQL学习笔记2--mysql 静态和动态plugin
  8. logstash 收集windows日志--解决日志不能重命名问题
  9. Lucene的索引链结构_IndexChain
  10. 基于Adobe LCDS产品的数据访问解决方案Part4