一、异常:
异常是指在程序运行过程中所发生的不正常事件,如:所需文件找不到,网络连接不通或连续中分段,算数运算出错,数下标越界等等。
二、常见的异常类型
1) 算数异常:ArithmeticException
2)输入不匹配异常:InputMismatchException
3)数组下标越界异常:ArrayIndexOutOfBoundsException
4)控制指针异常:NullPointerExceotion
5)非法参数异常:IllegalArgumentsException
6下标越界异常:IndexOutOfBoundsException
7)文件按未找到:FileNotFoundException
8)输入输出异常:IOExpectiom
9)数据库异常:SQLException
10)数据格式化异常:NumberFormException
比如:
1、算数异常
public class exception { public static void main(String[] args) { int a=5; int b=0; System.out.println(a/b);//输出5/0,0不能为除数; } }
结果
Exception in thread "main" java.lang.ArithmeticException: / by zero at exception.main(exception.java:10) //算数异常报(零不能作为除数) Process finished with exit code 1
2、输入不匹配异常
public class exception { public static void main(String[] args) { Scanner input=new Scanner(System.in);//创建键盘录入对象 System.out.print("请输入一个正整数:");//键盘录入提示 int a=input.nextInt();//录入一个int类型的变量 System.out.println(a); } }
运行结果
请输入一个正整数:b //输入字母b,与int不匹配 Exception in thread "main" java.util.InputMismatchException //提示:输入类型不匹配 at java.util.Scanner.throwFor(Scanner.java:864) at java.util.Scanner.next(Scanner.java:1485) at java.util.Scanner.nextInt(Scanner.java:2117) at java.util.Scanner.nextInt(Scanner.java:2076) at exception.main(exception.java:12)
3、数组下标越界
public class exception { public static void main(String[] args) { int[] a = {1, 3, 4, 6, 7};//定义一个下标从0~4的数组 System.out.println(a[5]);//输出下标为5的数组,很明显会造成数组越界 } }
运行结果
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 at exception.main(exception.java:11) //提示数组越界
其他类似............
三、异常处理
1、 关键字: try-catch
例如1:
public class exception { public static void main(String[] args) { try { Scanner input = new Scanner(System.in);//创建键盘录入对象 System.out.print("请输入一个正整数:");//键盘录入提示 int a = input.nextInt();//录入一个int类型的变量 System.out.println(a); }catch(InputMismatchException i){ System.out.println("请输入正确的数字"); } } }
运行结果1
请输入一个正整数:w
请输入正确的数字
运行结果2
请输入一个正整数:3
3
当然也可以用if-else完成,但是有以下缺点:
1、代码臃肿,加入大量的异常情况判断和处理代码
2、很难杜绝所有异常
3、浪费技能精力在堵漏洞上
4.处理异常代码和业务代码在一起,比较混乱。
2、try-catch处理异常的机制:
在try-catch语块中,会先执行try语句块,在执行try语句块过程会出现以下三种情况:
1、语句正常执行没有异常,那么catch中的语句块就不会执行。
2、try语句出现异常,并且这个异常和catch语句块中声明的异常类型匹配,那我try语句块内剩下的语句也不会执行,但会执行catch语句块内的语句。和后面的语句。
3、try语句块出现异常,但是这个异常和catch语句块内声明的异常类型不匹配,那程序会立刻退出;
catch语块中可以加入自定义方法,也可以调用异常对象的输出方法,常用的方法有:
1、viod printStackTrace();输出异常堆栈信息;(和不处理异常的相同)
2、String getMessage();输出异常的原因.
需要输出:System.out.print(String getMessage() )
3、try-catch-finally
不论是否发生异常都会执行
只有一种情况不会执行那就是在catch中出现System.exit(1)
4、存在return的try-catch-finally
异常会先产生异常对象——>进入异常类型——>执行catch块——>执行finally——>最后执行return
例子
public class Demo6 { public static void main(String[] args) { try{ System.out.println(5/0); }catch(ArithmeticException e){ System.out.println("catch 块"); return; }finally{ System.out.println("finally块"); }
可以debug走一下