Java_09【异常】

异常顾名思义程序发生了和正常结果不同的的情况在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 声明可能抛出的异常,然后交给上层调用它的方法程序处理

扫描二维码关注公众号,回复: 5695021 查看本文章
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
学习参考
生命不息!!!奋斗不止!!!

猜你喜欢

转载自blog.csdn.net/qq_36390039/article/details/88870168