目录
异常:程序没有按照预计的结果运行,在运行过程中发生了错误
一、异常的基本语法
try{
//可能会产生异常的代码,例如除0异常,数组越界异常,空指针异常等等;
}catch(异常类型 引用){
//出现异常以后如何处理
}finally{
//可以不写finally
//异常的出口,最终必定执行的代码
}
二、异常的相关处理
1、在程序中不处理异常
异常代码后面的代码就不会再执行了
2、处理异常的情况
3、异常也是类
catch代码块只能捕捉相应类型的“异常”类型
此时异常的原因是空指针异常,所以此时catch的数组越界异常处理就没用了,解决方法就是用到多个catch块
Exception是所有异常类的父类,当不确定会产生什么类型的异常时,就可以在catch块中使用Exception,就可以接收所有的异常类型。
4、输出异常的位置以及原因
调用异常对象的printstackTrace方法
5、对于finally代码块
无论是否有异常产生,最终都会执行finally代码块的代码
6、异常的处理流程
三、throw和 throws关键字
1、throws关键字
用在方法声明上,表示该方法可能会产生的异常类型,但是在本方法中不处理该异常,当异常产生就向上抛给调用者
2、throw关键字
用在方法内部,表示认为产生异常对象并输出
异常对象的产生都是在发生异常之后有JVM产生的,若需要认为产生异常对象,就使用throw关键字
四、异常体系
1、异常体系种类
JDK内部异常的继承关系,在java中异常分为两大类:
①''受查异常'':必须在编译阶段显示异常处理,否则编译就会报错
RuntimeExpetion(运行时异常)
ArrayIndexofBoundsExpetion(数组越界异常)
Erro(程序内部错误,一般来说,出现这种错误,程序就没办法在执行下去,只能退出程序)
②"非受查异常":在编译阶段可以不显示异常处理(不使用try catch\throws),也就是图中蓝色部分的内容,也就是图中的红色部分
2、自定义异常
JDK内部定义了好做异常类,但是在某些场景下,出现的错误需要我们自定义异常(用户登录时,用户名不对的异常),自定义异常,只需要继承相关的两个父类就可以。
若希望这个异常必须显示处理就继承Exception,如果这个异常不需要处理,就继承RuntimeException父类
public class MYException {
private static final String Username="张三";
private static final int Password=12345;
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入用户名: ");
String username=scanner.nextLine();
System.out.println("请输入密码: ");
int password=scanner.nextInt();
if(!Username.equals(username)){
throw new UserNameExcepton("用户名输入错误!!!");
}
if (Password!=password){
throw new PasswordException("密码输入错误!!!");
}
}
}
class UserNameExcepton extends RuntimeException{
public UserNameExcepton(String message){
super(message);
}
}
class PasswordException extends RuntimeException{
public PasswordException(String message){
super(message);
}
}