Java面向对象编程之异常处理机制
一: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块准备好相应的异常类型(对症下药,节约性能)

Java面向对象编程之异常处理机制的更多相关文章
- Java 中的异常处理机制
生活中的异常: 不能够完整而顺利的完成一些工作 根据不同的异常进行相应的处理,而不会就此终端我们的生活 引出: 异常处理: 方式: 1.选择结构(逻辑判断)避免 demo:if逻辑处理异常 im ...
- Java中的异常处理机制的简单原理和应用?
程序运行过程中可能出现各种"非预期"情况,这些非预期情况可能导致程序非正常结束. 为了提高程序的健壮性,Java提供了异常处理机制: try { s1... s2... s3... ...
- 16、java中的异常处理机制
异常:就是程序在运行时出现不正常情况.异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述.并封装成对象. 其实就是java对不正常情况进行描述后的对象体现. 对于问题的划 ...
- 黑马程序员——JAVA基础之异常处理机制
------- android培训.java培训.期待与您交流! ---------- 异常:就是程序在运行时出现不正常情况. 异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式 ...
- java中的异常处理机制
java异常处理机制 1)在java语言中,通常将可能出现异常的语句放入try{}语句中,将出现错误后需要执行的语句放入到catch{}语句中,将无论是否发生异常都要执行的语句放在finally{}语 ...
- Java基础(四)-异常处理机制及其设计
本篇主要是记录自己所理解的Java异常处理机制(基于jdk1.7)以及怎么去处理和设计异常.还记得当初学习Java异常这块的时候都没怎么注意它的用途,以为就是简单的处理下异常,我避免程序出现这样错误就 ...
- Java基础之异常处理机制
在Java中,异常分为编译时异常和运行时异常. 编译时异常又叫编译时被监测的异常:在程序编译过程中监测到非运行时异常的异常,出现该异常要么向上抛出,要么捕获处理.运行时异常(runtimeExcept ...
- JAVA学习之 异常处理机制
今天就来说说java的异常处理机制,异常处理不是第一接触,尤其是写过非常多c#的代码,基本都会写到异常处理的代码,事实上c#的异常处理与java的异常处理基本都是一样的,仅仅是在一些细节上不是非常一样 ...
- Java中的异常处理机制《》
异常机制已经成为判断一门编程语言是否成熟的标准,异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性. Java异常机制主要依赖于try.catch.finall ...
随机推荐
- JS 事件代理
事件处理器:onclick.onmouseover.... 在传统的事件处理中,你需要为每一个元素添加或者是删除事件处理器.然而,事件处理器将有可能导致内存泄露或者是性能下降——你用得越多这种风险就越 ...
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q36-Q39)
Question 36 You are designing a SharePoint 2010 application. You need to design the application so t ...
- Fragment与FragmentActivity的关系
前阵用viewpaper+fragment做滑动引导,查阅了下网上的资料,发现在有两种做法,一个是自建类直接继承Activity另一种是继承FragmentActivity,很是迷惑,在查了些goog ...
- Android实现与PHP服务器的交互
今天算是有点小激动呢!拿到Android与PHP这个课题已经两个星期了,直到今天才算是有了一点点小收获. 虽然还是没能成功上传到服务器,不过已经看到了曙光,已经实现了一半了,那就是已经连接到了服务器. ...
- Android studio git 本地仓库和远程仓库节点对比
1.初始状态 2.本地修改文件,然后commit 3.本地再次修改文件,然后commit 4.本地push 从上图可以看出,push完成后,本地仓库的节点和远程仓库的节点是一样的.
- entityframework lamda 使用where时的注意事项
我在项目中做了个底层 访问数据库泛型类 BaseEFDao<T> 在获取实体模型的时候使用了 Entities.CreateObjectSet<T>().Where(Func& ...
- 初学Spring有没有适合的书
初学者之前没有阅读java框架源码的习惯.没有阅读过源码,知道整体流程么?知道依赖注入的概念么?知道aop么?知道其中用到了哪些设计模式么?再说了,如果一上手就是源码?难道你没有注意到Spring的类 ...
- 使用TARGET_IPHONE_SIMULATOR和TARGET_OS_IPHONE宏区分模拟器和设备
#if TARGET_IPHONE_SIMULATOR NSLog(@"run on simulator"); #else NSLog ...
- Linux下怎么查看当前系统的版本
Linux下怎么查看当前系统的版本: uname -r 功能说明:uname用来获取电脑和操作系统的相关信息. 语 法:uname [-amnrsvpio][--help][--version] ...
- WPExpress78_update 离线包
http://115.com/lb/5lb7rnbr#Windows Phone SDK update for WP 7.8115网盘礼包码:5lb7rnbr 使用/layout下载的,相信很多朋友已 ...