异常处理

什么是异常?
异常是指程序在运行过程中,出现的不正常情况,程序运行时如果出现异常,将会中断正在执行的程序。
异常并不是错误,它只是程序在运行过程中出现的不正常情况。

异常按类型可分为两种:

1. 运行时异常 RuntimeException

用户操作不当造成,这一类异常是可以避免的,系统并不是强制要求处理,只要用户正确操作就可避免。

常见运行异常:

1.1 输入异常:(用户输入的数据格式不匹配)

java.util.InputMismatchException

1.2 数组下标越界:(数组下标超出了限定的范围)

java.lang.ArrayIndexOutOfBoundsException

1.3 数学运算异常(一般是计算是除数为0)

java.lang.ArithmeticException:/ by zero

1.4 空指针异常(对象没有初始化,就对该对象进行操作,此异常最为常见)

java.lang.NullPointerException

2. 受检查异常

这一类异常,是由于程序设计原因造成,用户无法避免,用户必须进行处理,否则程序无法运行。

如下图,使用时间类Date时出现的异常。

java 输出异常 java输入异常_System


当对程序中异常进行处理以后,程序可以继续运行,不会因为异常而中断

而处理方式系统也给出了两种:

第一种:使用throws向上抛出异常

谁调用产生异常的方法,谁处理异常。
总之,往上抛就够了。

代码举例如下:

public void show() throws 异常类型1,异常类型2{
	
	}
	public void show() throws Exception{
		
		throw new Exception("xxxx");
	}

在开发中,为了方便调试代码,我们也会自己抛出异常。
throws关键字,用于声明方法要抛出异常。
throw关键字,用于在代码中,手动抛出异常。

第二种:try/catch

代码举例:

public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入成绩:");
		
		try {
			//可能会出错的代码
			int score = sc.nextInt();
			System.out.println("成绩是:"+score);
		}catch (InputMismatchException ex) {
			//解决方案
			System.out.println("程序出现在异常,原因是用户输入的格式不匹配");
		}
		System.out.println("程序结束");
		
	}

①当try块中代码,正常运行没有异常时,那么不会进入catch块

②当try块中的代码出现异常,系统就会自动匹配catch的异常类型,如果类型一致,那么将执行catch块中的代码。

③catch块可以编写多个,用于获取不同类型的异常,代码举例如下:

try{
	
	}catch(异常类型1 ex){
	
	}catch(异常类型2 ex){
	
	}catch(异常类型3 ex){
	
	}finally{
		//此处的代码,是程序在最后必须要执行的代码(不论有没有异常,此处代码一定运行)
	}

难点:如果在代码中,有return,又有finally,如果return在finally之前,那么会先执行return,还是finally?

执行代码如下:

public static void main(String[] args) {
		Lx1 obj = new Lx1();
		 int age = obj.shouAge();
		 System.out.println("年龄是:"+age);
	}
	public int shouAge() {
		try {
			System.out.println("try块的代码正在运行");
			return 23;
		}catch(Exception ex) {
			System.out.println("catch块的代码正在运行");
			ex.printStackTrace();
		}finally {
			System.out.println("finally的代码运行");
		}
		return 0;
	}

注意,在代码的最后需要再return一个初始返回值,不然try中的return的返回值可能会丢失。
运行结果如下:

try块的代码正在运行
finally的代码运行
年龄是:23

可以看到,第一个执行的是try块中的代码,但是return并没有被执行;
第二个执行的finally,最后才是return的返回值。

所以,finally无论如何都是先于return执行的。

注:最大的异常只能放在最后面,不能放前面。
在处理异常时,一般要把异常打印在控制台,方便调试。
一般在finally中释放资源。