在项目开发中,如果代码中出现问题时,若通过if-else等逻辑代码去修改,会使得代码臃肿,程序员花费大量精力堵漏洞,尽管程序员也很难堵住所有漏洞.为此,异常机制就产生了。
(1)异常是指在程序运行过程中发生的不正常的事件,它会中断正在进行的程序。
(2)java语言使用异常处理机制为程序提供了错误处理的能力,程序中预先设置好对付异常的处理办法 ,程序运行后,对异常进行处理,处理完毕,继续运行.
(2)异常的原因:

  • 用户输入了非法数据。
  • 要打开的文件不存在。
  • 网络通信时连接中断,或者JVM内存溢出。

(3)异常分类:
所有的异常类是从 java.lang.Exception 类继承的子类。

当输入不合法时,使程序抛出异常,可以终止程序的运行:

public class HelloWord {
	public static void main(String[] args) {
		getWeek(12);
	}

	public static void getWeek(int day) {
		if (day == 1) {
			System.out.println("星期1");
		} else if (day == 2) {
			System.out.println("星期2");
		} else if (day == 3) {
			System.out.println("星期3");
		} else if (day == 4) {
			System.out.println("星期4");
		} else if (day == 5) {
			System.out.println("星期5");
		} else if (day == 6) {
			System.out.println("星期6");
		} else if (day == 7) {
			System.out.println("星期7");
		} else {
			// System.out.println("输入不合法!");
			throw new RuntimeException("输入的日期不合法");
			// 异常好处:可以让程序停止往下执行,是一种处理方法.
		}
		System.out.println("日期查询完毕");

	}

}

(4)junit单元测试:
①在要测试的方法名的上一行输入@Test后按下ctrl+1,双击选择Import’Test’,导包import org.junit.Test;

②双击方法名(test1)选中后右键Run As—>JUnit Test,运行

public class Demo1 {
	@Test
	public void test1(){
		System.out.println("aa");
	}
	@Test
	public void test2(){
		System.out.println("bb");
	}	
}

(5)throws/throw关键字:
throw和throws的区别是什么?
throws是在方法里抛出异常,可以抛出多个异常给虚拟机或者调用者去处理。
throw每次只能手动抛出一个异常,用try-catch处理或者是抛给别人。

①方法内部的throw:
手动抛出异常throw,
throw new Exception(“输入不合法~~”);

{
			// System.out.println("输入不合法!");
			throw new RuntimeException("输入的日期不合法");
			// 异常好处:可以让程序停止往下执行,是一种处理方法.
		}

②方法后面的throws
throws声明异常:,将异常抛给调用者处理,调用者必须进行try-catch;
位置:方法名后面进行声明异常,多个异常使用逗号隔开.


将内部的异常抛出去后,getWeek方法也报错,这时继续向外抛出异常.

(6)常见运行期异常:
①数组下标越界异常

ArrayIndexOutOfBoundsException

	@Test
	//1.数组下标越界异常
	//java.lang.ArrayIndexOutOfBoundsException
	public void test1() {
		byte[] b = new byte[3];
		System.out.println(b[4]);
	}

②算数异常

ArithmeticException

	@Test
	public void test2(){
		System.out.println(1/0);//0不能做除数
	}

③类型转换异常

ClassCastException

	@Test
	public void test3() {
		Object o = new String("china");
		Demo2 d = (Demo2) o;
		System.out.println(d);
	}

④空指针异常

NullPointerException

	@Test
	public void test4(){
		String str = new String("aa");
		str = null;
		System.out.println(str.length());
	}

⑤不能加载所需要的类

ClassNotFoundException

⑥方法接收到非法参数

lllegalArgumentException

⑦数字格式转换异常,如把"abc"转换成数字

NumberFormatException

编译器(检查期)异常:代码写完后,左侧行号前会有报错.

(7)常见异常处理方式:
1.使用try - catch块捕获异常.
①可能发生异常

  • 发生异常,产生异常对象,在catch的异常中进行匹配后捕获(可以是多路捕获)。
  • 没有异常跳过catch
try{
	可能发生异常的语句
}catch(Exception){
	捕获异常
}finally{
	无论是否有异常,都进入执行.
}

产生异常的测试:

import java.util.Scanner;

public class Demo1 {
	private static Scanner input;

	public static void main(String[] args) {
		try {
			input = new Scanner(System.in);
			System.out.print("请输入第一个整数:");
			int num1 = input.nextInt();

			System.out.println("请输入第二个整数:");
			int num2 = input.nextInt();
			int result = num1 / num2;
			System.out.println(result);
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		} finally {
			System.out.println("程序结束");
		}
	}
}


快捷键:
alt +shift +z
选中要加保险的代码,右击选中Surround With中的Try/catch Block后,会自动为代码加上try-catch
printStaticTrace();打印出异常的堆栈信息。

(7)两个注意点
①不走finally的情况:
在catch中加入System.exit(1);//退出java虚拟机
②try-catch块中存在return语句,是否还执行finally块?
答:执行,先走try,如果try中语句有异常,先走finally,然后再从finally返回执行return.