在 Java 中 , 运行时错误会作为异常抛出 。 异常就是一种对象 , 表示阻止正常进行程序执行的错误或者情况 。 如果异常没有被处理 , 那么程序将会非正常终止 。
常见的异常有:
IndexOutOfBoundsException
ArrayIndexOutOfBoundsException
数组角标越界异常 角标不在数组范围内
StringfIndexOutOfBoundsException
字符串角标越界异常 角标不在字符串范围内
NullPointerException
空指针异常 对null调用其成员
ArithmeticException
数学运算异常 非法的数学运算
ClassCastException
类型转换异常 将类进行错误的强制转换
NumberFormatException
数字格式化异常 将数字字符串进行解析
InputMismatchException
输入不匹配异常 在输入时输入非法数据
ParseException
时间解析异常 非法的时间格式
StackOverFlowError
栈内存溢出异常 函数递归
OutOfMemoryError
堆内存异常 数组空间开辟过大 程序中对象太多
异常处理
当出现异常时应该怎么做呢?
大部分的错误,其实都是由JVM发现并抛出的 当然我们也可以手动去判断,对于出现的异常,我们可以用throw()对异常进行抛出,或者用try-catch-finally语句捕获,哈可以对其异常进行声明,这样就不会影响到其他程序的运行。
异常主要可以分为:
运行时异常: RuntimeException是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类,可能在执行方法期间抛出但未被捕获的 RuntimeException 的任何子类都无需在 throws 子句中进行声明,指的就是这些问题不需要提前被预防的,因为只有在真正运行的时候才能发现是否发生问题,一旦在运行期间发生了问题,则一般不会修正,程序直接终端
编译时异常: Exception及其子类(除了RuntimeException),在编译时期抛出的异常, 在编译期间检查程序是否可能会出现问题,如果可能会有,则预先防范:捕获 声明
捕获 try-catch-finally 程序不至于中断
声明 throws 在函数后面 跟异常的类名 throw在函数内部 后面跟一个异常对象的 程序会可能会中断
private static int getNumber(int[] arr, int i) {
//return arr[i];//是由JVM来进行判断的
//模拟JVM的操作 用手动的判断模拟JVM自动的发现
if (arr == null) {
//产生一个空指针异常的问题对象
//用throw(抛出)关键字将产生的问题告知调用者
throw new NullPointerException();
//一旦上述抛出一个问题 此函数立马中断
//类似于return 正常结束(弹栈)
//throw非正常结束(中断 强制弹栈 并抛出问题给调用者)
}
if (i < 0 || i >= arr.length) {
//产生一个数组角标越界异常的问题对象
throw new ArrayIndexOutOfBoundsException();
//throw new StackOverflowError();
//PS 一旦出现错误 抛出问题即可 但是最好抛出最相关最精确的问题
}
return arr[i];
}
Throwable
Throwable类是 Java 语言中所有错误或异常的超类,只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。
Error是Throwable的子类,用于指示合理的应用程序不应该试图捕获的严重问题,所以一旦出现error就代表错误是不能容忍的,需要重新检查修改代码。
Exception类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件
一旦出现这种问题,是可以挽回的(不是必须的),挽回之后,接着正常运行即可
抛出异常
检测到错误的程序可以创建一个合适的异常类型的实例并抛出它 , 这就称为抛出一个异常
throw new 111 egalArgumentException ( " Wrong Argument " ) ;
声明异常
在 Java 中 , 当前执行的语句必属于某个方法 。 Java 解释器调用 main 方法开始执行一个程序 。 每个方法都必须声明它可能抛出的必检异常的类型 。 这称为声明异常 ( declaring exception ) 。 因为任何代码都可能发生系统错误和运行时错误 。
为了在方法中声明一个异常 , 就要在方法头中使用关键字 throws , 如下所示 :
public void myMethodO throws IOException
关键字 throws 表明 myMethod 方法可齙会抛出异常 IOException 。 如果方法可能会抛出多个异常 , 就可以在关键字 throws 后添加一个用逗号分隔的异常列表 :
public void myMethodO throws Excepti onl , Excepti on 2 , … , Excepti onN
捕获异常
try语句块中 放的是可能出现问题的代码 尽量不要把不相关的代码放入到里面 否则会出现截断的问题
try{
codeA
throw ...
codeB
}
如果throw这个地方一旦抛出异常 codeB就不会执行了
catch语句块中放的是出现问题并捕获后 处理问题的代码code 如果问题在try语句块中没有出现 则catch中不会运行
catch(Exception e) {
code
}
finally语句块中 放的是不管问题异常是否产生 都要执行的代码code
finally{
code//关闭资源(IO 数据库 网络),结尾处理的一些工作
}



