Java异常处理和异常抛出

生活中的异常是指那些有异于常态,和正常情况不一样,有问题的状态,编程世界中的异常是指阻止当前方法或作用域继续执行的状态。比如,程序要打开一个不存的文件、网络连接中断、除零操作、操作数越界、装载一个不存在的类等情况。这些情况会使程序中断执行。这时异常处理机制就很重要了,它会以适当的方法让程序继续执行或者退出,并且能够保存用户的当前操作或者进行数据回滚,最后再把占用的资源释放掉。
一.Java异常体系
异常的始祖是Throwable,它有两个儿子
Java异常处理和异常抛出_第1张图片
Error这类异常最好不要期待它出现,它一旦出现我们的程序就会 崩溃了,Error就好比工厂停水停电,机器坏了,我们是人为很难解决。异常最常见的就是Exception,它也有两个儿子,非检查异常,也是运行时异常,这种异常会有Java虚拟机自动抛出,并自动捕获。运行时异常出现,就说明了代码编写出现了问题,应该从逻辑上去改进代码。常见的就是它下面的四种情况。
检查异常,也是运行时异常,编译异常,出现由文件不存在或者链接异常,和非检查异常不同,需要手动的添加捕获和处理语句。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

Java异常处理和异常抛出_第2张图片

二.Java异常处理机制
我们在Java中用try-catch以及try-catch-finall语句块来捕获处理异常
1.基本格式如下
try {
//可能产生异常的代码部分
//捕获异常
} catch (Exception e) {
//对获取的异常信息进行处理
}finally{
//异常部分以外的代码
}
2.处理原则
A.没有出现异常时。只有catch中的代码不会被执行,其他部分的代码都会被执行。
B.try中代码出现异常时。catch部分代码会被执行,进行异常的处理。而try中发生异常之后的代码都不会被执行。
C.当try中抛出多种类型的异常的时候,使用多重catch来捕获不同类型的异常。看个示例

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
     Scanner input=new Scanner(System.in);
     try {
    	 System.out.println("请输入第一个数");
         int one=input.nextInt();
         System.out.println("请输入第二个数");
         int two=input.nextInt();
         System.out.println("两数相除的结果为"+one/two);
	} catch (InputMismatchException e) {
		// TODO: handle exception
		System.out.println("你应该输入整数");
	}
     catch(ArithmeticException e){
    	 System.out.println("你应该输入非0的数");
     }
     }
	

}

当你第一个输入的是一个字符串,它会抛出一个不匹配异常,被第一个catch捕获,结果如下
Java异常处理和异常抛出_第3张图片
当你第一个输入正确,第二个不正确时,结果如下
Java异常处理和异常抛出_第4张图片
编写多重catch语句,需要注意,捕获异常要从小到大从子类到父类。因为一场处理机制会就近寻找异常处理程序,而子类继承于父类,对于父类的异常处理程序,子类也是适用的,例如上面的例子,可以在最后添加一个针对异常Exception的catch语句,用来捕获其他异常,因为catch是上面两个异常的父类。
三.异常处理机制小结
(1)当发生异常的时候,在try代码块中捕捉异常,异常代码发生行之后的代码不再运行。
(2)只有当try代码块发生异常的时候,才会执行到catch代码块。
(3)不管try中是否发生异常,finally代码块和try…catch…finally以外的代码块都会执行(当有return关键字的时候,这两个代码块的执行情况还有所不同,后面会讲到)。
不过当代码中出现System.exit(0)时需要格外小心,以下两种情况都会导致finally和try…catch…finally以外的代码块无法执行:
A.try中不发生异常时,try块中有System.exit(0);
B.try中发生异常时,catch中有System.exit(0);
补充:System.exit(0)是退出虚拟机的语句,可以视为强制终止程序的指令。

四.异常抛出
上面我们学习了try-catch来抛出处理异常,那么这些遗产格式怎么抛出的呢?这里就用到throws和thorw
两者的用法
Java异常处理和异常抛出_第5张图片两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

throws的异常声明
throws异常抛出的是异常类的对象,这个对象带有所发生异常的信息,可以直接使用Java已经封装好的异常类信息,也可以自定义异常类
1.使用Java定义好的异常类,并使用throws继续上抛

public class Test {
    public void divide(int one,int two) throws IOException{
    	System.out.println("两数相除的结果为"+one/two);
    }
    public void compute()throws IOException{
    	divide(5,0);
    }
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
     Test test=new Test();
     test.compute();

}
}

结果如下
在这里插入图片描述
2.使用自己定义的异常类,并使用try-catch处理异常

public class Test {
    public void divide(int one,int two) throws Exception{
    	if(two==0){
    		throw new Exception("两数相除,除数不能为0!");
    	}
    	else{
    		System.out.println("两数相除结果为"+one/two);
    	}
    }
    public void compute(){
    	try {
			divide(5,0);
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e.getMessage());
		}
    }
	public static void main(String[] args) {
		// TODO Auto-generated method stub
     Test test=new Test();
     test.compute();

}
}

运行结果
在这里插入图片描述
总结
throws就是一个不负责任的自私鬼,当遇到异常的时候只会往外抛,抛给它的上一级,自己不去处理,而try-catch就是很负责任的人,捕获到了异常会自己解决。

你可能感兴趣的:(JAVA)