相信我们或多或少遇到或者听过有时候在代码里面明明try catch了异常,但是程序报错却没有捕获到错误。这个原因其实就涉及的异常体系了。我们先看看一个例子:
public class ExceptionText {
public static void main(String[] args) throws Throwable{
try{
throw new Throwable();
}catch (Exception e) {
System.out.println("new Throwable() is success.");
}
}
}
下图试运行结果
打印信息组成:
所处线程名字、异常类名、异常信息、异常堆栈、异常的源码,包名,类名,方法名,行数
- 常见方法:
getMessage : 错误信息的字符串解释
getCause:返回异常产生的原因,一般是原始异常如果不知道原因返回null
printStackTrace:打印异常出现的位置或原因,不建议使用,该方法会产生的字符串记录的是堆栈信息,太长太多,内存被填满,建议使用logger输出到日志文件
toString:返回String格式的Throwable信息,此信息包括Throwable的名字和本地化信息
initCause:初始化原始异常
PrintStream和PrintWriter作为产生实现重载,这样就能实现打印栈轨迹到文件或流中
常见异常:
NullPointException:空指针异常,对象是null时会出,在调用传入对象时尽量判断是否为nullldk8里面可以用Optiona对象来避免
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:类里找不到相应的方法,一般是iar版本不对,当前引用的jar版本中没有这个方法->检查jar版本是否正确
UnsupportedClassVersionError:版本不支持错误,编译dass的idk和运行时候的idk版本不一致或比较高>将低饭本换成高版本
StackOverflowError:栈溢出错误,一般是函数的死循环,或递归调用无法退出->检查死循环的代码,或让递归有退出值,或加大栈初始化参数
,