异常顾名思义程序发生了和正常结果不同的的情况在Java编程思想中这样描述:是指阻止当前方法和作用与继续执行的问题。异常情形不等于普通问题。
01异常处理机制
当Java程序发生异常会有异常处理机制结关程序,并寻找一个恰当的地方来继续执行程序,这个恰当的地方就是异常处理程序,他的任务是将程序从错误中恢复,让程从错误中恢复,使程序要么换一种方式运行,要么继续下去。
02Java异常的种类
1。Java中的所有不正常类都继承于Throwable类。Throwable主要包括两个大类,一个是Error类,另一个是Exception类;
2.其中Error类中包括虚拟机错误和线程死锁,一旦Error出现了,程序就彻底的挂了,被称为程序终结者;
3.Exception类,也就是通常所说的“异常”。主要指编码、环境、用户操作输入出现问题,Exception主要包括两大类,非检查异常(RuntimeException)和检查异常(其他的一些异常)
检查异常
非检查异常(RuntimeException)
常见的非检查异常
01空指针异常(NullPoineException)
String str = null;
System.out.println(str.length());
/**
Exception in thread "main" java.lang.NullPointerException
**/
02数组下表越界异常(ArrayIndexOutOfBoundsException)
int[] arr = {1,2,3};
for(int i=0;i<=3;i++){
System.out.println(arr[i]);
}
/**
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:
**/
03类型转换异常(ClassCastException)
class FF{
}
class A extends FF{
}
class B extends FF{
}
public class Test{
public static void main(String[] args) {
FF ff = new A();
FF ff2 = new B();
A a1 =(A)ff;
A a2 =(A)ff2;
}
}
/**
Exception in thread "main" java.lang.ClassCastException
**/
04算数异常(ArithmeticException)
int a=12;
int b=0;
System.out.println(a/b);
/**
Exception in thread "main" java.lang.ArithmeticException
**/
try-catch-finally
发现异常解决异常
1 .try 专门捕获异常,一旦try中发现异常,程序的控制权将被移交给catch块中的异常处理程序。
特点:try语句块不可以独立存在,必须与 catch 或者 finally 块同存
2.catch 专门处理异常可以选择性分类处理由开发者制定或者自动
特点: 多个catch块处理的异常类,要按照先catch子类后catch父类的处理方式
3.finally 最终必须执行的代码 用于关闭和释放资源
try{
//一些会抛出的异常
}catch(Exception e){
//第一个catch
/ /处理该异常的代码块
}catch(Exception e){
//第二个catch,可以有多个catch
//处理该异常的代码块
}finally{
//最终要执行的代码
}
处理多个嵌套异常块顺序问题先子类再父类,finally语句块处理最终将要执行的代码。
finally块中的return语句可能会覆盖try块、catch块中的return语句;如果finally块中包含了return语句,即使前面的catch块重新抛出了异常,则调用该方法的语句也不会获得catch块重新抛出的异常,而是会得到finally块的返回值,并且不会捕获异常。
总结:
1、不管有无出现异常或者try和catch中有返回值return,finally块中代码都会执行;
2、finally中最好不要包含return,否则程序会提前退出,返回会覆盖try或catch中保存的返回值。
3. e.printStackTrace()可以输出异常信息。
4. return值为-1为抛出异常的习惯写法。
5. 如果方法中try,catch,finally中没有返回语句,则会调用这三个语句块之外的return结果。
6. finally 在try中的return之后 在返回主调函数之前执行。
throw和throws关键字
程序主动将异常抛出
String a = "abc";
if(a.equals("abc")){
System.out.println("标记");
throw new NumberFormatException();
}else{
System.out.println(a);
}
01 throws
声明将要抛出何种类型的异常
1 public void 方法名(参数列表)
2 throws 异常列表{
3 //调用会抛出异常的方法或者:
4 throw new Exception();
5 }
当某个方法可能会抛出某种异常时用于throws 声明可能抛出的异常,然后交给上层调用它的方法程序处理
throw与throws比较
1、throws出现在方法函数头;而throw出现在函数体。
2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
良好的编码习惯:
1、处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理
2、在多重catch块后面,可以加一个catch(Exception)来处理可能会被遗漏的异常
3、对于不确定的代码,也可以加上try-catch,处理潜在的异常
4、尽量去处理异常,切记只是简单的调用printStackTrace()去打印
5、具体如何处理异常,要根据不同的业务需求和异常类型去决定
6、尽量添加finally语句块去释放占用的资源
部分内容引用
https://www.cnblogs.com/hysum/p/7112011.html
学习参考
生命不息!!!奋斗不止!!!