异常
Java程序出现不正常的情况
异常的分类
Java中的异常:Throwable
严重的问题:Error,我们不处理,这样的问题一般都是很严重的,比如说内存溢出(OOM)
问题:Exception(异常)分为编译时期异常与运行时期异常
编译时期异常:除了RuntimeException都是编译时期异常,必须要处理,如果不处理,程序编译无法通过,无法运行
运行时期异常:RuntimeException,这样的问题,一般情况下,我们不会对问题本身进行处理,因为这样的问题是在自己写代码的过程中由于逻辑的不严谨导致的。
如果程序出现了问题,并且我们没有做任何处理,最终JVM会做出默认处理,把异常的名称,相关的原因,以及出现问题的信息输出在控制台上,同时程序会停止,而且后续的代码不会执行。
异常的分类图解:
处理异常的两种方法
1、try...catch...finally
2、throws
try...catch...finally
try...catch...finally的处理格式:
try{
可能会出现问题的代码
}catch(异常类名 变量名){
针对出现问题后的处理代码
}finally{
只要是程序顺利进行,finally中的内容无论如何都会执行
}
变形格式:
try{
可能会出现问题的代码
}catch(异常类名 变量名){
针对出现问题后的处理代码
}
注意:try中的代码越少越好;catch中必须要有内容,即使内容只是一句简单的提示语句
以除数为0举例:
当在代码中直接输出10除以0时,编译不会出现异常,但运行会出现异常,即出现运行时期异常。
加入try...catch处理异常:
public class Demo1 {
public static void main(String[] args) {
int a=10;
int b=0;
try{
System.out.println(a / b);
}catch (ArithmeticException e){
System.out.println("除数为0,无法相除");
}
}
}
输出结果:
上述是处理一个异常的情况,当处理两个及以上个异常的情况时,有两种做法:
1、每一个异常写一个try..catch
2、写一个try,多个catch:
第二种做法格式为:
try{
可能会出现问题的代码
}catch(异常类名1 变量名1){
针对异常1做的处理方案
}catch(异常类名2 变量名2){
针对异常2做的处理方案
}... ...
当处理多个异常使用第二种方案时的注意事项:
1、catch只能匹配对应的异常,并且只能匹配一个异常
2、平级关系的异常顺序无所谓,但如果出现了父子继承关系,父类必须放在最后
3、try中的代码如果出错了,try中出错代码后面的代码不会执行,就会匹配catch中的异常,匹配到后执行解决方案,try...catch后面的代码正常执行。
4、catch中的异常类名尽量明确,不要用大的异常去处理
代码举例:
使用算术异常ArithmeticException和下标索引越界异常ArrayIndexOutOfBoundsException
public class Demo2 {
public static void main(