Java异常相关知识汇总

一、异常体系结构

Java把异常作为一种类,当做对象来处理。所有异常类的基类是Throwable类。

1. Throwable的子类有2个:Error和Exception。

1.1 Exception的子类主要的有2个:IOException和RuntimeException

可点击查看大图Java异常相关知识汇总_第1张图片

1.1.1 IOException的子类主要的有:

(1)EOFException,表示在输入中意外地到达文件或者流的结尾

(2)FileNotFoundException

可点击查看大图Java异常相关知识汇总_第2张图片

1.1.2 RuntimeException的子类主要有:

(1)IndexOutOfBoundsException,下标越界异常

(2)NullPointerException,空指针异常

(3)MissingResourceException

(4)ArithmeticException,算术运算异常

(5)IllegalArgumentException,非法参数异常

(6)ClassCastException,类型转换异常

可点击查看大图Java异常相关知识汇总_第3张图片

1.2 Error的子类有:VirtualMachineError,AWTError(用户界面组件错误),IOError,ThreadDeath等

可点击查看大图在这里插入图片描述

1.2.1 VirtualMachineError的子类主要有:

(1)OutOfMemoryError,内存溢出错误

(2)StackOverflowError,栈溢出错误

(3)InternalError,

(4)UnknownError

总结到下面这种图
Java异常相关知识汇总_第4张图片

二、习惯分类

  • 未检查异常(unckecked exception)
    Error和RuntimeException以及他们的子类。javac在编译时,不会提示和发现这样的异常,不要求在程序处理这些异常。

  • 检查异常(checked exception)
    除了Error和 RuntimeException的其它异常。javac强制要求程序员为这样的异常做预备处理工作(使用try…catch…finally或者throws)。在方法中要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,否则编译不会通过。

三、异常或错误产生原因

1、NullPointerException

(1)调用空对象的方法

(2)访问或修改空对象的属性

(3)获取空数组的长度

(4)访问或修改空数组的某个位置的值

(5)将一个空对象当做异常抛出

2、StackOverflowError

Oracle官网给的解释:because an application recurses
too deeply.如果线程请求的栈深度大于虚拟机所允许的最大深度,就会抛出StackOverFlowError异常。一个具体的例子就是递归函数,无限次地调用自己而不终止,就会造成栈溢出。

(1)使用-Xss参数来减少栈内存容量。

(2)定义大量的本地变量,增大此方法帧(栈帧)中本地变量表(局部变量表)的长度。

3、OutOfMemoryError

(1)如果虚拟机栈或者本地方法栈可以动态扩展,如果扩展时无法申请到足够的内存

(2)如果在堆中没有内存完成实例分配,并且也无法再扩展

(3)当方法区无法满足内存分配需求时

(4)各个内存区域总和大于物理内存限制,从而导致直接内存动态扩展时出现OOM

仔细想想,主要的限制是不是来自两个方面(#.#)

A.各个运行时数据区(除了程序计数器)是否能动态扩展,最大值参数的设置

(-Xmx:最大堆容量,-MaxPermSize最大方法区容量,-Xss:栈容量)

B.本机总内存大小和处理器寻址空间

你可能感兴趣的:(Java)