异常 Exception
- 将程序中发生的不正常的情况称为异常。语法和逻辑错误不是异常。
- 分为两类
- Error(错误):java虚拟机无法解决的严重问题。
- Exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。分为两大类:运行时异常(逻辑错误,编译器检测不出来,可以不处理)、编译时异常(必须处理)
常见运行时异常
NullPointerException 空指针异常
- 当程序试图在需要使用的地方使用null
ArithmeticException 数学运算异常
- 运算不符合数学规则时,比如整数除以0
ArrayIndexOutOfBoundsException 数组下标越界异常
- 用非法索引访问数组时,比如索引为负数或大于等于数组长度
ClassCastException 类型转换异常
-
试图将对象强制转换为不是实例的子类
NumberFormatException 数字格式不正确异常
- 当应用程序试图将字符串转换成一种数字类型,但该字符串不能转换为适当的格式时。可以用来确保输入是满足条件的数字
编译异常
-
在编译期间就必须处理的异常,否则编译不通过
-
常见编译异常
- SQLException 操作数据库时,查询表可能发生异常
- IOException 操作文件时,发生的异常
- FileNotFoundException 当操作一个不存在的文件时
- ClassNotFoundException 加载不存在的类
- EOFEException 操作文件,到文件末尾
- ILLegalArguementException 参数异常
异常处理
- try-catch-finally和throws二选一即可。
- 如果没有显式的处理异常,默认采用throws,一层一层的抛,最后抛给jvm
try-catch-finally
try-catch-finally 处理机制
基本语法
try{
//可疑代码
//将异常生成对应的异常对象,传递给catch块
}catch(异常){
//对异常的处理
}
finally{
//如果没有finally,语法是可以通过的
}
注意事项
-
如果异常发生了,则try块里面异常发生后面的代码不会执行,直接进入到catch块
-
如果异常没有发生,则顺序执行try的代码块,不会进入到catch
-
如果希望不管是否发生异常,都执行某段代码(关闭连接,释放资源),则使用
finally{}
-
可以有多个catch语句,捕获不同的异常(进行不同的业务处理),要求子类异常在前,父类异常在后,如果发生异常,只会匹配一个catch(疑问 第一个异常抛出来了后面的代码都不会执行了,第二个异常有用吗?解答:只会匹配一个异常,哪有异常就在哪抛,后面的代码都不会执行了)
try{ }catch(NUllPointerException e){ // }catch(Exception e)
-
可以进行try-finally配合使用,这种用法相当于没有捕获异常,因此有异常时会运行完
finally
后直接崩掉。使用场景:执行一段代码,不管是否发生异常,都必须执行某一个业务逻辑
例题
循环判断用户输入是否是一个整数
public class test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int i;
System.out.print("请输入一个整数:");
while (true) {
String input = scanner.next();
try {
i = Integer.parseInt(input);
break;
} catch (Exception e) {
System.out.print("输入错误,请重新输入:");
}
}
System.out.println("输入正确,你输入的是:" + i);
}
}
throws
throws 处理机制
基本介绍
-
如果一个方法执行时可能产生某种异常,但是不确定如何处理这些异常,则此方法应显式的声明抛出异常,表明该方法将不对异常进行处理,而由该方法的调用者负责处理
-
在方法声明中用
throws
语句可以声明抛出异常的列表,throws后面的异常类型可以是产生的异常类型,也可以是他的父类
使用细节※
-
对于编译异常,程序中必须处理,要么使用try-catch,要么使用throws
-
对于运行时异常,程序中如果没有处理,默认使用throws处理
-
子类重写父类方法时,对抛出异常的规定:子类重写方法抛出的异常,要么与父类相同,要么是父类异常的子类
自定义异常
定义步骤
1、定义类:自定义异常类名,继承Exception或RuntimeException
2、如果继承Exception,则属于编译异常
3、如果继承RuntimeException,属于运行异常
- 一般情况自定义异常做成运行时异常,可以使用默认的处理机制
class AgeException extends RuntimeException{
public AgeException(String message){//构造器
super(message);
}
}
public class test{
public static void main(String[] args){
int age =180;
if(!(age>=18 && age <= 120)){
throw new AgeException("年龄需要在18-120之间");
}
}
}