1、异常的体系
①
②error:程序无法处理的错误。error发生的时候,java虚拟机会将程序终止
exception:程序本身可以处理。
③运行时异常:大多数包括Runtime Exception以及它的一些子类,比如空指针异常,数组越界异常等,这些异常是不检查的异常,程序中可以选择try...catch...,也可以选择不处理,这些异常一般是由于逻辑错误引起的,程序应该尽可能地从逻辑角度避免这类错误的发生。
④非运行时异常:除了运行时异常以外的异常。从程序语法角度来说是必须处理的异常,如果不处理,程序是编译不通过的。而刚才所说的运行时异常,程序是可以运行通过的。非运行时异常包括我们的io exception, sql exception以及我们自定义的一些exception
2、异常的使用
throws语句只能在方法处抛出异常,throw语句可以在任何地方都抛出异常
3、
4、
①如果在try中执行了system.exit()方法关闭了虚拟机,finally代码块是不会被执行的
②如果在try中rturn了一个值,那么finally代码块是会被执行的,并且会在return方法之前执行
③不能在finally方法中改变变量的值
④会有丢失异常或者catch代码块不被执行的结果
5、java中的检查型异常和非检查型异常有什么区别?
检查型异常:经编译器验证对于声明抛出异常的任何方法,编译器将强制执行处理或声明规则
非检查异常:不遵循处理或声明规则,在产生此异常时,不一定要采取任何适当操作,编译器不会检查是否已经解决了这样一个异常。如Runtime Exception和Error
6、throw和throws这两个关键字在java中有什么不同?
throw:总是出现在函数体内,是函数运行中抛出的一个具体异常,它抛出的异常需要代码人员来捕获处理
throws:throws是方法可能抛出异常的声明,调用者可能需要处理这些异常
7、如果只选finally代码之前方法返回了结果,或者jvm退出了,finally块中的代码还会执行吗?
finally代码块不会执行的三种情况:
①在执行try代码块时退出了jvm虚拟机
②在子线程中执行try...catch...代码块中突然关闭了线程,也可能不执行finally代码块
③在try之前执行了不进入try中的方法时
在finally代码块之前返回了结果,finally代码块是会被执行的,而如果在try代码块中jvm退出了,finally代码块是不会被执行的
8、java中final,finalize,finally关键字的区别?
final
当这个关键字修饰一个类时,意味着他不能派生出新的子类,也就是说不能被继承,因此一个类不能被同时声明为abstract和final。当final修饰变量或者方法时,可以保证他们在使用中不会被改变。被声明为final的变量必须在初始化时给定初值,以后在使用时只能被引用而不能被修改。同样,当final修饰一个方法时,这个方法不能被重载。
finally
异常处理时提供finally来执行任何清楚操作。如果抛出一个异常,那么相匹配的catch子句就会被执行,然后控制就会转入finally块。
finalize
方法名。finalize方法在垃圾回收器执行内存对象清理时会调用finalize()方法进行前期的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
Java中所有类都从Object类中继承finalize()方法。
当垃圾回收器(garbage colector)决定回收某对象时,就会运行该对象的finalize()方法。值得C++程序员注意的是,finalize()方法并不能等同与析构函数。Java中是没有析构函数的。C++的析构函数是在对象消亡时运行的。由于C++没有垃圾回收,对象空间手动回收,所以一旦对象用不到时,程序员就应当把它delete()掉。所以析构函数中经常做一些文件保存之类的收尾工作。但是在Java中很不幸,如果内存总是充足的,那么垃圾回收可能永远不会进行,也就是说filalize()可能永远不被执行,显然指望它做收尾工作是靠不住的。
那么finalize()究竟是做什么的呢?它最主要的用途是回收特殊渠道申请的内存。Java程序有垃圾回收器,所以一般情况下内存问题不用程序员操心。但有一种JNI(Java Native Interface)调用non-Java程序(C或C++),finalize()的工作就是回收这部分的内存。