Java基础05 异常处理

  • 什么是异常?
    从广义上讲,程序中所有的错误都可以称为异常。按照异常出现的时期我们可以将其分为编译时异常和运行时异常,编译时的异常一般情况下都比较容易处理,而运行时异常就是Java异常处理需要解决的问题
  • 出现了异常我们应该做点什么?
    • 保护现场
    • 阻止程序继续执行
    • 处理
  • Java中的异常处理机制
    Java中的异常大部分是在方法运行过程中发生的,且Java中万物皆对象,我们会构造一个包含了错误信息的对象进行抛出,寻找异常处理器进行处理

  • Java的异常类层次结构

    •  所有的异常类都继承自Throwable
    • Error:程序运行中一般不会发生(系统内部错误,资源耗尽等),一旦发生就是毁灭性的,我们也无法在程序中进行处理
    • Exception:可捕获的异常(不要求一定要捕获)
      • IOException:检查型异常;程序本身没有问题,异常是由于类似于I/O操作产生的,需要显式捕获处理
      • RuntimeException:不要关注名字的含义,我们讨论的异常都是运行时异常;这类异常是代码逻辑上的错误导致的,如果出现了这种异常(比如数组指针越界),那么一定是程序员的问题;对待这种异常,我们关注的不是如何捕获处理,而是关注如何防止它的产生!
  • 异常处理
    • 抛出异常
      • 方法运行中可能会出现无法处理或者需要通知调用者的错误(这个需要大家自己去摸索),这时我们需要构造异常类对象进行抛出
      • 语法上需要(若异常是该方法调用的其他方法抛出的,那么直接方法声明throws即可)
        • 构造异常类对象
        • throw抛出
        • 方法声明throws
          //假设文件承诺有length个字符
          public String readData(Scanner in) throws EOFException {
              
              ...
              while(...) {
                  if (!in.hasNext()) {
                      //未读取到全部的字符文件就结束了
                      if (n < length) {
                          throw new EOFException();
                      }
                  }
                  ...
              }
          }
          public void readData() throws IOException{
              InputStream is = new InputStreamReader(...);
              int v = is.read();//read方法可能会抛出异常
          }
    • 捕获异常
      • 如果有能力处理异常,有能力将异常在本方法内消化,那么就需要捕获处理,也就是异常处理器
      • 语法上
        • try-catch-finally结构:语法上可以 try-catch,try-finally,try-catch-finally,根据实际需要使用
        • catch语句块中仍然可以抛出异常
        • finally语句块执行时机:所有该执行的都执行完(抛出异常、catch处理),return之前
      • finally可能出现的问题
        • finally中改变return中返回的值:其实return语句是在finally之前执行,但没有返回,将要返回的变量的值暂存后执行finally,然后将暂存值取出返回
          int a = 1;
          try {
              return a; //a变量的值1暂存  取出1值返回
          } finally {
              a = 2; //修改a变量的值为2
          }
          public static void main(String[] args) {
              System.out.println(fun().i); //输出为2
          }
          
          public static class A {
              int i = 1;
          }
          
          public static A fun() {
              A a = new A();
              try{
                  return a; //暂存a变量的值(对象的地址)   取出暂存变量值返回(对象地址)
              }finally {
                  a.i = 2; //改变对象属性值
              }
          }
        • finally中存在return语句:会覆盖原先的返回值,甚至会覆盖抛出的异常;不要在finally语句块中包含控制流语句(return,throw,break等)
  • 方法的执行流程
    方法执行流程

西瓜要挖着吃

一个通往大佬之路的男人

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注