Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 557|回复: 0

Java面向对象编程之异常处理机制

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-9-7 10:31:21 | 显示全部楼层 |阅读模式

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

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

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

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

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

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

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

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

    1 public void methodA()
    2 {
    3 try{
    4 System.out.println(5/0);
    5 }catch(ArimeticException e){
    6 
    7 //处理异常
    8 }
    9 }


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

    1 public void methodB thorws Exception()
    2 {
    3 System.out.println(5/0);
    4 }

    执行过程:当一个方法正常执行完毕的时候,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<0)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(-1);
    System.out.print("main");
    }catch(Exception e){
    System.out.print("wrong");
    }

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

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

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

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

     1 public static void main(String[] args) { 
     2 try {    
     3 foo();            
     4  int c = 300; // 冗余      
     5 } catch (IOException e) {            
     6  int a = 100;
     7 
     8   int c = 300; // 冗余         
     9 } catch (Exception e) {
    10              int b = 200;
    11             int c = 300; // 冗余         
    12 } finally {
    13   int c = 300;         }     }

    详见: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...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 13:10 , Processed in 0.059391 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表