一、异常:
异常是指在程序运行过程中所发生的不正常事件,如:所需文件找不到,网络连接不通或连续中分段,算数运算出错,数下标越界等等。
二、常见的异常类型
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
语法: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走一下