java异常机制

1、异常分类
java中异常对象都是Throwable类的一个实例,Java有内置的异常类,用户也可以创建自己的异常类

Java异常层次结构:

Throwable又派生了Exception Error,Error表示Java运行时系统的内部错误和资源耗尽错误,应用程序不应该抛出此类对象,而应该告诉用户,并尽可能的安全中止程序,Exception分为两个分支,一个是RuntimeException表示程序错误导致的异常,而程序本身没有错误,但是由于像I/O操作导致的异常属于其他异常

RuntimeException出现的情况主要有:错误的类型转换,数组访问越界,访问空指针,IOException出现的情况主要有:试图在文件尾部后面读取数据,试图打开一个不存在的文件,试图根据一个字符串查找Class类,而表示的这个类不存在
“如果出现RuntimeException,那么一定是你的错误”
异常分类:
检查异常:除了Error和RuntimeException的其他异常都是检查异常,强制必须要求对此类异常进行处理,throw或try catch语句,要么捕获要么抛出,否则编译不会通过,如 IOException
非检查异常:Error和RuntimeExcepiton,这种异常在编译期间不会提示,如果愿意,可以编写代码处理这种异常
这中分类是针对编译来说的

检查异常:

如 public FileInputStream(String name) throws FileNotFoundException
因为 FileNotFoundException是检查异常,所以必须处理,这里抛出异常,不去处理,交给调用者去处理,如果使用者不处理,编译不通过

        try {
            FileInputStream fileInputStream = new FileInputStream("nihao");
        } catch (FileNotFoundException e) {
            System.out.print("文件不存在");
        }
    try {
        func();
    } catch (IOException e) {
        
    }

public void func() throws IOException { // 我不想处理该异常,交给调用者去处理
    return;
}

非检查异常:
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    int[] a = {1, 2, 3};
    System.out.print(a[6]); // 程序crash 异常抛出点,因为该异常没有任何处理,最后会交给JRE
}
这种异常可以处理,也可以使用try catch finally处理,但是这种异常一般时由于代码错误引起,我们应该修正代码,而不应该去捕获和处理
try {
    int[] a = {1, 2, 3};
    System.out.print(a[6]);  // 捕获异常后,不会发生crash
} catch (Exception e) {
    e.printStackTrace();
} finally {
    // 会执行到
}

即使捕获异常后,非检查异常不会导致程序crash,但是仍然最好修正代码

try {
   
} catch (RuntimeException e) { // 没有错误,因为是非检查异常
    e.printStackTrace();
} finally {
    // 会执行到
}
try {

} catch (IOException e) { // 有错误,对应的try中没有抛出检查异常
    e.printStackTrace();
} finally {
    // 会执行到
}
对于非检查异常,不管try语句内时什么内容都可以捕获异常,而对于检查异常,try语句块内不许含有抛出该异常的使用。
    func();
}

public void func()  {
    throw new RuntimeException(); // 非检查异常抛出,但是没有捕获,JRE终止程序
}

3finally

唯一不让finally执行的方法是system.exit(),否则即使try中即使有return,不论异常有无发生都会执行,良好的编程习惯是在try中打开资源,在finally中关闭资源,发生异常时先执行catch,然后执行finally,如果catch中再抛出异常,然后再外围寻找catch,如果发生异常,没有匹配的catch,先执行finally,然后去外围寻找匹配的catch,另外finally中的return 会覆盖try 或者catch中的返回值。

4throw

两种方法方法内部throw new Exceptionpublic void func() throw Exception {},前者抛出异常和JRE抛出异常相同,会导致程序终止

5、异常链接

源码Thowable内有一个成员变量

private Throwable cause = this;

初始化为自己,可通过构造函数传入,表示引起该异常的异常。

public Throwable(String message, Throwable cause) {

    fillInStackTrace();

    detailMessage = message;

    this.cause = cause;

}

这种方法可以用于异常链接,为了防止模块软件开发中出现的异常覆盖现象,如

try {

    return;

} catch (RuntimeException e) {

    throw new RuntimeException("nihao", e);

}

6、自定义异常

可以参考IOExption的实现,一般会提供无参,stringThrowable参数的构造函数

public

class IOException extends Exception {

    static final long serialVersionUID = 7818375828146090155L;



    public IOException() {

        super();

    }



    public IOException(String message) {

        super(message);

    }



    public IOException(String message, Throwable cause) {

        super(message, cause);

    }



    public IOException(Throwable cause) {

        super(cause);

    }

}

 

常见异常有:

检查异常:EOFExption文件读取异常,文件结尾了,但是仍然继续读取文件

FileNotFoundException文件不存在异常

非检查异常:ArrithmeticException运算异常,如除数为0

ClassNotFoundException根据给定的string找不到类的异常

NullPonterException对象为空异常

IIlegalArgumentException向一个方法传递了一个不合法的参数

ArrayIndexOutOfBoundsException数组越界异常

ClassCastException强制数据类型转换异常

错误:OutOfMemoryError内存溢出, 当再申请新的内存时,虚拟机分配无法再分配新的内存,

StackOverFlowError由于当前线程的栈满了  ,也就是函数调用层级过多导致,如死递归,当栈深度超过虚拟机分配给线程的栈大小时就会出现此error


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值