一:Java的异常处理机制的优点:

1:把各种不同情况的异常情况分类,使用JAVA类来表示异常情况,这种类被称为异常类。把各种异常情况表示成异常类,可以充分的发挥类的可扩展性和可重用性。

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

3:可以灵活的处理异常,如果发生了异常程序员可以手动抛出异常,也可以交给调用者来处理异常。

二:Java虚拟机的方法调用栈

Java虚拟机用方法来调用栈来跟踪每个线程一系列的方法调用过程,该堆栈保存了每个调用方法的本地信息(比如说方法的局部变量)!每个线程都有一个独立的方法调用栈。对于Java应用程序的主线程,堆栈的底部是程序的入口方法main();当一个新方法被调用的时候,java虚拟机把描述该方法的的栈置于栈顶,位于栈顶的方法即为正在执行的方法,方法调用顺序,main()方法调用methodA()方法,而methodB()被methodA()方法调用!

如果方法中的代码块中出现了异常,可以使用以下两种方式解决!

(1)在当前方法中使用try—catch结构捕获到当前方法的异常!

 public void methodA()
{
try{
System.out.println(/);
}catch(ArimeticException e){ //处理异常
}
}

(2)在方法声明处通过throws语句抛出异常!

 public void methodB thorws Exception()
{
System.out.println(/);
}

执行过程:当一个方法正常执行完毕的时候,java虚拟机会从栈中弹出该方法的栈结构,然后继续处理前一个方法。如果在执行方法的过程中抛出了异常,则java虚拟机必须找出能捕获该异常的catch代码块,它首先查看方法中是否存在这样的代码块,如果存在则执行该代码块,否则Java虚拟机会从栈中弹出该方法的栈结构,继续到前一个方法中找符合该异常的catch块!

当java虚拟机执行到栈底的底部的方法时,如果仍然没有找到处理该异常的的代码块,将按以下步骤处理:

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

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

三:如何运用Java的异常处理机制

在java中一般使用try-catch语句来处理异常

try{
//可能出现异常的语句
}catch(Exception e){
//发生异常后执行的语句
}
public class Text{
public void MethodA(int money) throws Exception
{
if(money<)thorw new Exception("钱数不符合规范")
System.out.print("methodA");
}
public void MethodB(int money) throws Exception
{
MethodA(money);
System.out.print("methodB");
}
public static void main(String[] args)
{
try{
new Text().method(-);
System.out.print("main");
}catch(Exception e){
System.out.print("wrong");
}

下面代码输出的正确结果Wrong。

finally语句:任何情况下都会执行的代码(除非在catch块中程序员手动停止程序的运行)

思考:为什么finally字句一定会被执行呢?

答案:编译器确实是在每个catch语句块后都添加了finally块中的字节码, try块的最后也有int c = 300字节码的冗余。如果翻译成Java代码应该这样的:

 public static void main(String[] args) {
try {
foo();
int c = ; // 冗余
} catch (IOException e) {
int a = ; int c = ; // 冗余
} catch (Exception e) {
int b = ;
int c = ; // 冗余
} finally {
int c = ; } }

详见:http://blog.csdn.net/neosmith/article/details/48093427
异常语句的语法规则(try,catch,fianlly,throw,throws)

(1):try代码块不能脱离catch代码块或finally代码块单独执行!

(2):try代码块后面可以有0个或多个catch块,也可以由0个或多个finally块,如果catch代码块和finally代码块共存,则必须保证fianlly代码块必须在catch块之后!

(3):try代码块后可以只跟finally代码块!

(4):在try代码块中声明的变量作用域仅限于try代码块,catch块和fianlly块无法访问!

(5):当try代码块后跟着多个catch代码块时,java虚拟机会把实际抛出的异常对象依次和各个catch代码块中的异常类型进行匹配

(6):throw语句后不允许跟任何语句,因为这些语句永远不会被执行(和return类似)

异常的处理原则:

(1):异常只能用于非正常情况(处理异常损耗性能)

(2):为异常有适当的说明

(3):保证异常的原子性(即发生异常后程序的各个部位都能回到运行初期正常的轨迹上(例:优化MySchool数据库设计中的转账异常处理))

(4):避免庞大的try代码块(代码越多,越容易引发异常)

(5):为catch块准备好相应的异常类型(对症下药,节约性能)

最新文章

  1. kgcd ,fmod,fgcd
  2. Bulk_Collect 调用方式集锦
  3. (spring-第21回【MVC基础篇】)SpringMVC一点就通
  4. [函数] Firemonkey 取得 Windows 目前 User 的 Desktop 目录
  5. iOS本地化
  6. VMware12中CentOS7网络设置
  7. (转)Ratchet教程:创建项目
  8. 国内最大的 Node.js 社区将 New Relic 的监控产品换成了 OneAPM
  9. DDL\DML\DCL\DQL
  10. linux-touch
  11. 实例说明optimize table在优化MySQL时很重要
  12. Electron 创建一个空白的界面
  13. 升级MySQL5.7,开发不得不注意的坑
  14. 《网络编程》IPv4 与 IPv6 相互操作
  15. owin启动事项
  16. Windows Phone本地数据库(SQLCE):6、[Index] attribute(翻译)(转)
  17. SharePoint自动化部署,利用PowerShell 导入用户至AD——PART II
  18. netty答题
  19. MVC 中文显示乱码问题
  20. hihocoder [Offer收割]编程练习赛61

热门文章

  1. Hadoop出现 native snappy library not available: SnappyCompressor has not been loaded的解决办法
  2. xmpp整理笔记:环境的快速配置(附安装包)
  3. Android 采用HttpClient提交数据到服务器
  4. Android App监听软键盘按键的三种方式与改变软键盘右下角确定键样式
  5. 【代码笔记】iOS-手机号验证
  6. C#复习⑨(附带C#参考答案仅限参考)
  7. Virtual Box 杂记
  8. 单元测试中如何配置log4net
  9. Java NIO 同步非阻塞
  10. 继续说一下openjson 以及 json path 的使用 (2)