手把手教你学习Java异常机制和如何一步步排除,解决bug!

Java异常处理:

  1. Java的异常机制:
    • 对Java的程序运行状态进行监控,在出现异常后,自动捕获异常信息,并调用异常处理逻辑,对异常进行处理的机制。
    • 异常处理机制会作为守护线程,来陪伴程序运行。收集异常信息,根据异常的类型,创建对应的 Exception对象,封装本次异常的信息。
    • 获取方法的执行权,方法不再向下执行,而是向上寻找处理异常的逻辑-> catch语句块。这个寻找是层层向上寻找:当前方法中如果没有处理逻辑,则将 Exception对象发送给方法调用者,在其中查找处理逻辑,如
      果还是没有,则继续向上找。
    • 如果本程序中都找不到异常处理逻辑,该异常会被抛给JVN,JVM会结束产生异常的线程,将异常信息输出在控制台上。
    • 如果该异常得到正常处理,则原程序后续的代码会继续执行。
  2. try / catch 语句块
    • 开发者可以使用try语句块包裹可能出现异常的代码,然后在ty语句块后
      添加 catch语句块,指定要捕获的异常类型,并在 catch语句块中添加异常
      的处理逻辑。
  3. 异常处理逻辑:
    • 异常的具体处理逻辑分为2类:
      • 通用性的处理逻辑:显示或记录异常的信息,显示异常信息到控制台:e.printStackStrace();该方法会将异常的详细信息以红色文字输出到控制台,记录异常信息:调用日志插件的方法 LogUtil log("…")。
        2.结合当前情况的处理逻辑。
  4. Java中的异常分类:
    • Throwable:所有异常和错误类的父类
      • Exception:异常 —>表示代码中出现的异常,一般和代码或配置有关,和开发者有关。
      • Error:错误 ---->表示系统错误,一般和程序运行的大环境有关与开发者关系较小。
    • 编译异常(受检异常):这类异常是Java编译器强制要求开发者必须提供异常处理逻辑的异常。如SQLEception、IOException等等。如果你的代码或者你调用的方法可能“编译异常”,必须在代码中显式提供处理逻辑:
      • 在方法前添加 Throws语句,表示本方法不处理该异常,交给方法的调用者去处理。
      • 使用ty- catch包裹代码,在 catch中添加处理逻辑。
    • 运行时异常(非受检异常):这类异常不强制必须在编译时进行处理的异常。如NullException等等。也就是说,如果开发者调用的方法或者编写的代码可能出现 Runtime Exception或其子类异常时,编译器不会提醒开发者必须提供处理逻辑。特别注意!出现运行时异常不处理,JVM也会直接停掉出异常的线程。
  5. 异常处理的设计机制:所有的运行时异常( RuntimeException),都是可以通过提高代码的严谨性和逻辑性来解决的,因此,没有必要提醒开发者。而编译时异常,往往是开发者再严谨,也可能出现的异常。

bug排除流程及原理:

学习了Java的异常处理原理之后,我们就有必要来学习一下如何处理异常,怎么找,怎么改?

  • 故意制造bug,来分析,我们拿最近用的JDBC的代码来体验描述异常!
  • 随便手写一个Java程序,我拿我的举列子。
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5nKGQyxN-1592221989397)(https://img.99couple.top/20200615192846.png)]
  • 是不是提示你有未解决得SQL异常,这是不是我们说的编译异常(受检异常),是不是提示你的解决方法有两种,是不是我们说的那两种。相信你看到这了一定秒懂了。
  • 我们用第一种往上抛,运行后发现还是会报错。报错如下图。这就告诉我们要养成习惯,有问题想着去解决(利用try / catch 在catch语句块中添加逻辑),不要想着光往上抛,往上抛只是单纯的不报错了,但是实际上还是有问题的。刨到最后就到了JVM那里,到了那里就是有问题就杀死你!将你的临时变量全部清理掉,不管对于你是否重要。不管三七二十一。(JVM想的是你敢抛我就敢扔,看看谁更渣)如果到了实际工作中,就会产生不可估计的损失。我们必须要对重要临时变量进行持久化保存!
  • 下面是运行时异常,我们代码在编写时没有问题,没有报错信息,也不用try / catch,但是在运行时却出了问题。如下图:
  • 到这里是不是分清楚了Java异常!接下来我们了解一下Throwable类的源码中的三个重要属性:
    • detailMessage:封装的异常产生的原因,字符串形式的文字描述,也是排bug时最应该看的东西。
    • stackTrace:方法的调用轨迹,根据这个内容我们可以逐步锁定是哪个方法的哪行代码出了问题。
    • cause:导致当前异常的原因(异常)在有些情况下,当前异常是由另一个异常导致的, cause变量用于关联导致当前异常的那个异常对象,如果没有,默认指向自己。
    • 接下来我们利用三个例子来学习如何排bug!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值