java异常机制和File类

Error类用于描述java虚拟机无法解决的严重错误,通常无法编码解决。如:JVM垮掉了
Exception用于描述因编程错误或者偶然外在因素导致的轻微错误,通常可以通过编码解决。如0作为除数

异常分类
java.lang.Exception是所有异常的超类,分为以下2种

  • RuntimeException 运行时异常 也叫非检测性异常
  • IoException和其他异常称为其他异常 也叫检测性异常(编译器在编译阶段能够检测出来)

对于Error我们无能为力,主要解决对Execption的处理

检测异常和非检测异常

常见异常

异常的处理

程序出现异常后,如果程序员没有进行处理将由JVM按照默认的方式进行处理并结束程序的执行

package com.cn.hello;
import java.io.IOException;
public class Animal  {
    public static void main(String[] args) {
       int a=4;
       int b=0;
       System.out.println(a/b);//算术异常
        int c[]=new int[3];
        int d=3;
        System.out.println(c[d]);//数组下标越界异常
        String str=null;
        System.out.println(str.length());//空指针异常
        Exception ex=new Exception();
        IOException IO=(IOException) ex;//类的类型转换异常
        String str1="hdhh123";
        int m=Integer.parseInt(str1);//数字格式异常
        System.out.println("程序执行完毕");

    }
}

当出现异常时程序会终止执行,以上的程序会报出算术异常,之后的程序将不会再执行

用if判断进行程序异常的避免
那个类转换异常的阻止类可以使用,程序会先进行类的加载

package com.cn.hello;
import java.io.IOException;
public class Animal  {
    public static void main(String[] args) {
       int a=4;
       int b=0;
       if(b!=0) {
           System.out.println(a / b);//算术异常
       }
        int c[]=new int[3];
        int d=3;
        if(d>=0&&d<3) {
            System.out.println(c[d]);//数组下标越界异常
        }
        String str=null;
        if(str!=null) {
            System.out.println(str.length());//空指针异常
        }
        Exception ex=new Exception();
        if(ex instanceof IOException) {
            IOException IO = (IOException) ex;//类的类型转换异常
        }
        String str1="hdhh123";
        if(str1.matches("\\d+")) {
            int m = Integer.parseInt(str1);//数字格式异常
        }
        System.out.println("程序执行完毕");

    }
}
output:程序执行完毕

用if判断成功阻止了程序的中断
但用if判断会加长代码, 可读性差

当程序出现异常后直奔catch分支进行处理

手动处理异常和没有处理异常的区别在于代码是否向下执行

虽然用Execption类可以接收所有的异常的对象,但这样写影响代码的可读性,在开发中推荐用try cath 的接连组合进行对象的接收

Exception类接收的异常,要放在最后

Fanally的使用

finally里面 面向无论是否发生异常都要执行的代码

当出现当有一些意想不到的异常没有被捕获,然后交由JVM进行处理,导致程序终止执行,Finally里面的代码此时还可以执行
举例:

package com.cn.hello;
import java.io.IOException;
public class Animal  {
    public static void main(String[] args) {
      int a=5;
      int b=0;
      try {
          System.out.println(a / b);
      }catch (ArithmeticException e){//进行算术异常的处理
          e.printStackTrace();
          System.out.println("我捕获了异常哦");
          String str=null;
          str.length();

      }

      finally {
          System.out.println("我还可以执行哦");
      }
        System.out.println("程序截至");
    }
}
output:
        java.lang.ArithmeticException: / by zero
        at com.cn.hello.Animal.main(Animal.java:8)
        Exception in thread "main" java.lang.NullPointerException
        at com.cn.hello.Animal.main(Animal.java:13)
        我捕获了异常哦
        我还可以执行哦

finally通常用于善后 如文件的关闭

finally的笔试----可能存在改变方法返回值的问题

package com.cn.hello;
import java.io.IOException;
public class Animal  {
    public static int test(){
        int a=4;
        int b=0;
        try{
            System.out.println(a/b);//该步异常跳转到catch处理 return 0不执行
            return 0;
        }catch (ArithmeticException e){
            e.printStackTrace();//该步执行完后 有finally必须让其语句最后执行
            return 1;//return 2执行后程序截至,该句没有执行
        }
        finally {
            return 2;
        }
    }
    public static void main(String[] args) {
        System.out.println(Animal.test());//输出2
    }
}

方法异常的抛出
当在某些情况下有些异常不能处理或者不便处理时,就可以将该异常转移给该方法的调用者,这种方式就叫异常的抛出
底层是生成了一个异常类的对象然后抛出

package com.cn.hello;
import java.io.FileInputStream;
import java.io.IOException;
public class Animal  {
    public static void show()throws IOException{//此时利用多态有IoException接收2个子异常
        FileInputStream fis=new FileInputStream("d:/a.txt");
        System.out.println("hello");
        fis.close();
    }
    public static void main(String[] args)/*此时可以在main方法中继续抛出但不建议throws IOException*/ {

        try {
            show();
        } catch (IOException e) {
           e.printStackTrace();
        }
        System.out.println("world");
    }
}
java.io.FileNotFoundException: d:\a.txt (系统找不到指定的文件。)
        at java.io.FileInputStream.open0(Native Method)
       
        world

子类重写父类抛出异常分析

异常可以抛出也可以捕获,开发种怎样处理?

第二种方式举例

自定义异常的抛出

posted @ 2022-11-17 09:06  一往而深,  阅读(29)  评论(0编辑  收藏  举报