1.error和exception有什么区别?
error表示系统级的错误,是java运行环境内部错误或者硬件问题,不能指望程序来处理这样的问题,除了退出运行外别无选择,它是Java虚拟机抛出的。
exception 表示程序需要捕捉、需要处理的异常,是由与程序设计的不完善而出现的问题,程序必须处理的问题。
2.说出5个常见的RuntimeException?
(1)Java.lang.NullPointerException 空指针异常;出现原因:调用了未经初始化的对象或者是不存在的对象。
(2)Java.lang.NumberFormatException 字符串转换为数字异常;出现原因:字符型数据中包含非数字型字符。
(3)Java.lang.IndexOutOfBoundsException 索引越界异常。
(4)Java.lang.ArrayIndexOutOfBoundsException数组下标越界异常。(5)Java.lang.IllegalArgumentException 方法传递参数错误。
(6)Java.lang.ClassCastException 数据类型转换异常。
(7)ArithmeticException算术异常
3.throw和throws的区别?
(1)throws 用来声明一个方法可能抛出的所有异常信息,表示出现异常的一种可能性,但并不一定会发生这些异常;throw 则是指拋出的一个具体的异常类型,执行 throw 则一定抛出了某种异常对象。
(2)通常在一个方法(类)的声明处通过 throws 声明方法(类)可能拋出的异常信息,而在方法(类)内部通过 throw 抛出一个具体的异常信息。
(3)throws 通常不用显示地捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法; throw 则需要用户自己捕获相关的异常,而后再对其进行相关包装,最后将包装后的异常信息抛出。
4.Java中异常分类
按照异常处理时机:
编译时异常(受控异常(CheckedException))和运行时异常(非受控异常(UnCheckedException))
5.如何自定义异常
继承Exception是检查性异常,继承RuntimeException是非检查性异常,一般要复写两个构造方法,用throw抛出新异常
如果同时有很多异常抛出,那可能就是异常链,就是一个异常引发另一个异常,另一个异常引发更多异常,一般我们会找它的原始异常来解决问题,一般会在开头或结尾,异常可通过initCause串起来,可以通过自定义异常
6.Java中异常处理
首先处理异常主要有两种方式:一种try catch,一种是throws。
1.try catch:
try{} 中放入可能发生异常的代码。catch{}中放入对捕获到异常之后的处理。
2.throw throws:
throw是语句抛出异常,出现于函数内部,用来抛出一个具体异常实例,throw被执行后面的语句不起作用,直接转入异常处理阶段。
throws是函数方法抛出异常,一般写在方法的头部,抛出异常,给方法的调用者进行解决。
7.常见的异常
NullPointException:空指针异常,对象是null时会抛出,在调用传入对象时尽量判断是否为null,Jdk8里面可以用Optional对象来避免
IndexOutOfBoundsException:索引越界异常
NumberFormatException:数字类型转化异常,将非数字类型转成数字类型,将类型转化的代码catch住
ClassCastException:类型转换异常,发生在强转时,将不同类型转成同一类型,尽量少用强转,或用instanceof(判断继承中子类的实例是否是父类的实现)做类型判断,或多用泛型
FileNotFoundException:找不到指定文件,文件路径错误或文件不存在,可能用了绝对路径检查文件是否存在,路径是否写错,多用相对路径
ClassNotFoundException:在classpath中找不到引用的类缺乏引用当前类的jar或没有设置classpath或jar损坏-,找到jar并放入classpath中或检查jar是否损坏
OutOfMemoryError:内存溢出异常,产生对象太多,内存不够->不要在循环体重创建大量对象,或对象及时回收,增大初始化堆:-Xms 增加最大值:-Xmx
NoClassDefFoundError:找不到相应的类错误,缺乏当前引用类的jar或jar版本不对->找到jar并放入classpath中或找到合适的版本
ConcurrentModificationException:并发修改异常,在集合迭代时修改里面的元素->在迭代时不要修改集合或用并发集合做遍历(如:ConcurrentHashMap)
NoSuchMethodError:类里找不到相应的方法,一般是jar版本不对,当前引用的jar版本中没有这个方法->检查jar版本是否正确
UnsupportedClassVersionError:版本不支持错误,编译class的jdk和运行时候的jdk版本不一致或比较高->将低版本换成高版本
StackOverflowError:栈溢出错误,一般是函数的死循环,或递归调用无法退出->检查死循环的代码,或让递归有退出值,或加大栈初始化参数
8.异常打印信息组成
所处线程名字、异常类名、异常信息、异常堆栈、异常的源码,包名,类名,方法名,行数
9.常见方法
getMessage:错误信息的字符串解释
getCause:返回异常产生的原因,一般是原始异常如果不知道原因返回null printStackTrace:打印异常出现的位置或原因
toString:返回String格式的Throwable信息,此信息包括Throwable的名字和本地化信息initCause:初始化原始异常
PrintStream和PrintWriter作为产生实现重载,这样就能实现打印栈轨迹到文件或流中
10.如何自定义异常
继承Exception是检查性异常,继承RuntimeException是非检查性异常,一般要复写两个构造方法,用throw抛出新异常
如果同时有很多异常抛出,那可能就是异常链,就是一个异常引发另一个异常,另一个异常引发更多异常,一般我们会找它的原始异常来解决问题,一般会在开头或结尾,异常可通过initCause串起来,可以通过自定义异常