java异常机制和可视化bug追踪

java异常机制和可视化bug追踪

异常机制

异常引入

  • 程序中的异常
    • 示例1:给出除数和被除数,求商
      • 如果除数为0,出异常
      • 如果除数或者被除数不是数字,出异常
    • 示例2:将d:/a.txt复制到e:/a.txt
    • 如果d:/a.txt不存在
    • 如果e:/存在a.txt
    • 如果e盘空间不足
    • 如果复制过程中出错
if(“d:/a.txt”这个文件存在){
    if(e盘的空间大于a.txt文件长度){
        if(文件复制一半IO流断掉){
            停止copy,输出:IO流出问题!
        }else{
            copyFile("d:/a.txt","e:/a.txt");
        }
    }else{
        输出:e盘空间不够存放a.txt!
    }
}else{
    输出:a.txt不存在!
}
  • 异常( Exception 也称例外)就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序

    • 所需文件找不到
    • 网络连接不通或中断
    • 算术运算错 (被零除…)
    • 数组下标越界
    • 装载一个不存在的类或者对null对象操作
    • 类型转换异常
    • ……
  • 当Java程序出现以上的异常时,就会在所处的方法中产生一个异常对象。这个异常对象
    包括异常的类型,异常出现时程序的运行状态以及对该异常的详细描述。

  • Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws

在这里插入图片描述

异常分类

  • JDK中定义了很多异常类,这些类对应了各种各样可能出现的异常事件,所有异常对象都是派生于Throwable类的一个实例。如果内置的异常类不能够满足需要,还可以创建自己的异常类
    Java对异常进行了分类不同类型的异常分别用不同的Java类表示,所有异常的根类为java.langThrowable,Throwable下面又派生了两个子类:Error 和 Exception。 Java异常类的层次结构如图6-2所示。

在这里插入图片描述

异常处理

  • try-catch

    • 情况1:try块中代码没有出现异常
      • 不执行catch块代码,执行catch块后边的代码
    • 情况2:try块中代码出现异常,catch中异常类型匹配(相同或者父类)
      • 执行catch块代码,执行catch块后边的代码
    • 情况3:try块中代码出现异常, catch中异常类型不匹配
      • 不执行catch块代码,不执行catch块后边的代码,程序会中断运行
    • 注意
      • 出现异常后,Java会生成相应的异常对象,Java系统,寻找匹配的catch块,找到后将异常对象付给catch块异
        常参数
      • 出现异常后,try块中尚未执行的语句不会执行
      • 出现异常后并处理后,catch块后面的语句还会执行
  • try-catch

  • catch块中如何处理异常

    • 输出用户自定义异常信息

      • System.err.println(“除数不能为零。”);

      • System.err.println(“被除数和除数必须是整数。”);

    • 调用异常对象的方法输出异常信息

      • toString ( )方法,显示异常的类名和产生异常的原因
      • void printStackTrace() 输出异常的堆栈信息
      • String getMessage()返回异常信息描述字符串,是printStackTrace()输出信息的一部分
    • 继续向上抛出异常

      • throw e
  • try-catch

    • 异常类型
    方 法 名说 明
    Exception异常层次结构的根类
    ArithmeticException算术错误情形,如以零作除数
    ArrayIndexOutOfBoundsException数组下标越界
    NullPointerException尝试访问 null 对象成员
    ClassNotFoundException不能加载所需的类
    InputMismatchException欲得到数据类型与实际输入类型不匹配
    IllegalArgumentException方法接收到非法参数
    ClassCastException对象强制类型转换出错
    NumberFormatException数字格式转换异常,如把"ab"转换成数字
  • try-catch-finally

    • 在try-catch块后加入finally块,可以确保无论是否发生异常,finally块中的代码总能被执行

      • 无异常 try-finally

      • 有异常 try-catch-finally

    • 通常在finally中关闭程序块已打开的资源,比如:文件流、释放数据库连接等。

    • finally块中语句不执行的唯一情况

      • 异常处理代码中执行System.exit(1)退出Java虚拟机
    • Finally块的具体执行过程

      • 执行try或catch中代码
      • 遇到return/throw,先执行finally中语句块
      • 执行return/throw
  • 多重catch

    • 一段代码可能会引发多种类型的异常
    • 当引发异常时,会按顺序来查看每个 catch 语句,并执行第一个与异常类型匹配的catch语句
    • 执行其中一条 catch 语句后,其后 catch 语句将被忽略
    • 在安排catch语句的顺序时,首先应该捕获最特殊的异常, 然后再逐渐一般化,即先子类后父类

异常的处理

捕获异常

  • 捕获异常是通过3个关键词来实现的:try-catch-finally。用try来执行一段程序,如果出现异常,系统抛出一个异常,可以通过它的类型来捕捉(catch)并处理它,最后一步是通过finally语句为异常处理提供一个统一的出口,finally所指定的代码都要被执行(catch语句可有多条;finally语句最多只能有一条,根据自己的需要可有可无)。如图6-10所示。

在这里插入图片描述

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Test {
    public static void main(String[] args) {
        FileReader reader = null;
        try {
            reader = new FileReader("d:/a.txt");
            char c = (char) reader.read();
            char c2 = (char) reader.read();
            System.out.println("" + c + c2);
        }catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if(reader!=null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
  • 常用开发环境中,自动增加try-catch代码块的快捷键
    • 将需要处理异常的代码选中
    • IDEA中,使用:ctrl+alt+t
    • eclipse中,使用:ctrl+shift+z

声明异常(throws子句)

  • 当CheckedException产生时,不一定立刻处理它,可以再把异常throws 出去。
    在方法中使用try-catch-finally是由这个方法来处理异常。但是在一些情况下,当前方法并不需要处理发生的异常,而是向上传递给调用它的方法处理。
  • 如果一个方法中可能产生某种异常,但是并不能确定如何处理这种异常,则应根据异常规范在方法的首部声明该方法可能抛出的异常。
  • 如果一个方法抛出多个已检查异常,就必须在方法的首部列出所有的异常,之间以逗号隔开。
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Test {

    public static void main(String[] args) /*throws Exception*/ {
        try {
            readFile("d:/a.txt");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void  readFile(String path) throws Exception {
        FileReader reader = null;
        try {
            reader = new FileReader(path);
            char c = (char) reader.read();
            char c2 = (char) reader.read();
            System.out.println("" + c + c2);
        }finally {
            try {
                if(reader!=null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

try-with-resource自动关闭Closable接口的资源

  • JAVA中JVM的垃圾回收机制可以对内部资源实现自动回收,给开发者带来了极大的便利。但是JVM对外部资源(调用了底层操作系统的资源)的引用却无法自动回收,例如数据库连接,网络连接以及输入输出IO流等。这些连接就需要我们手动去关闭,不然会导致外部资源泄露,连接池溢出以及文件被异常占用等。
  • JDK7之后,新增了“try-with-reasource”。它可以自动关闭实现了 AutoClosable接口的类,实现类需要实现close()方法。"try-with-resources声明”,将try-catch-finally 简化为 try-catch,这其实是一种语法糖,在编译时仍然会进行转化为try-catch-finally 语句。
import java.io.FileReader;
import java.io.IOException;

public class Test {

    public static void main(String[] args) /*throws Exception*/ {

        try(FileReader reader = new FileReader("d:/a.txt");) {
            char c = (char) reader.read();
            char c2 = (char) reader.read();
            System.out.println("" + c + c2);
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}

自定义异常

  • 在程序中,可能会遇到JDK提供的任何标准异常类都无法充分描述清楚我们想要表达的问题,这种情况下可以创建自己的异常类,即自定义异常类。

  • 自定义异常类只需从Exception类或者它的子类派生一个子类即可

  • 自定义异常类如果继承Exception类,则为受检查异常,必须对其进行处理;如果不想处理,可以让自定义异常类继承运行时异常RuntimeException类。

  • 习惯上,自定义异常类应该包含2个构造器:一个是默认的构造器,另一个是带有详细信息的构造器。

如何利用百度解决异常问题

  • 正常学习和开发中我们经常会遇到各种异常。大家在遇到异常时,需要遵循下面五步来解决:

    1. 细心查看异常信息,确定异常种类和相关Java代码行号

    2. 确定上下文相关的一些关键词信息(疑难问题,需要)

    3. 拷贝异常信息到百度,查看相关帖子,寻找解决思路

    4. 前两步无法搞定,再问同学或同事

    5. 前三步无法搞定,请示领导。

  • 很多人碰到异常一下就慌了,立刻开始请教别人搬救兵,殊不知这样做有两大坏处。第一、太不尊重别人,把别人当苦力。第二、失去提高自我的机会,自己解决一个异常,就意味着有能力解决一类异常。解决一类异常能大大提高自身能力。
    不要怕花时间在解决问题上不要觉得解决问题是耽误时间。解决问题的过程中,本身你也在思考。

  • 百度超级搜索:

    百度/Google搜索用好的关键是:关键词的确认,正确的提问。

    1. 寻找问题本身的关键词(名词)
    2. 寻找问题上下文的关键词(名词)
    3. 尽量细致的描述问题,开始搜索I
    4. 如果没找到,慢慢减少关键词,扩大搜索范围。

IDEA开发环境的调试视图

  • IDEA提供了非常方便的程序调试功能进行调试的核心是设置断点。程序执行到断点时暂时挂起,停止执行。就像看视频按下停止一样,我们可以详细的观看停止处的每一个细节。

断点breakpoint

  • 程序运行到此处,暂时挂起,停止执行。我们可以详细在此时观察程序的运行情况,方便做出进一步的判断。
  • 设置断点:
    (1)在行面单击即可增加断点
    (1)在断电上再点击即可取消
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZXLzhuzhu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值