在项目开发中,如果代码中出现问题时,若通过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.