异常的处理

27 篇文章 0 订阅
22 篇文章 0 订阅

异常是一个类
Throwable是所以错误和异常的超类,他有两个子类error和exception

Exception :编译期异常,进行翻译(写代码)java程序出现的问题
	RuntimeExcepeion :运行期异常,java程序过程中出现的问题
	异常就 相当于程序得了一个小毛病,把异常处理啦,程序可以继续执行
error:错误
	错误就相当于程序问题很多,必须修改源代码,程序才能继续执行

异常处理的原理分析:
在这里插入图片描述
步骤:
1、编译有异常,JVM就会检测出程序的异常
JVM会做两件事:
1、JVM会根据异常产生的原因创建一个异常对象,这个异常对象包含了异常产生的(内容、原因、位置)
2、在出现异常的方法中没有异常的处理逻辑(try……catch) ,那么JVM就会把异常对象抛出给方法的使用者(调用此方法的方法)
2、方法的使用者接收这个异常对象,但是其也没有处理异常的逻辑,那么继续将异常对象抛给自己的方法使用者,直到main方法,但是main方法也没有异常的处理逻辑,就将异常对象抛给JVM处理
3、JVM接收到异常对象会做两件事:
1、把异常对象(内容、原因、位置)打印到控制台
2、JVM会终止当前执行的java程序:中断处理

抛出异常关键字throw
作用:
可以使用throw关键字在指定的方法中抛出指定的异常
使用格式:
throw new ***Exception (“异常产生的原因”);
注意:
1、throw关键字必须写在方法内部
2、throw关键字后面new的对象必须是Exception或者Exception的子类对象
3、throw关键字抛出指定的异常对象,我们必须处理这个异常对象
throw关键字后面创建的是RuntimeException或者是RuntimeException的子类对象,我们可以不进行处理,默认交给JVM处理(打印异常对象,中断程序)
throw关键字后面创建的是编译异常(写代码的时候报错),我们必须处理这个异常,要么throw,要么 try……catch

**在一个方法中我们首先必须对传递过来的参数进行合法性检验,如果参数不合法,那么我们必须使用抛出异常的方式,告知方法的调用者,传递参数有问题。**
1、NullPointerException是运行期异常,我们不用处理,默认交给JVM处理
2、ArrayIndexOutOfBoundsException是运行期异常,我们不用处理,默认交给JVM处理

objects非空判断
public static T requirNonNull(T obj):查看对象是不是null
在这里插入图片描述
应用时:Object.requirNonNull(Obj)或者Object.requirNonNull(Obj,message)

throws关键字——异常处理的第一种方法
作用:
当方法内部抛出异常对象时,那么我们就必须处理这个异常 对象
可以使用throws关键字处理异常对象,会把异常对象声明抛出给方法的调用者处理,最终交给JVM处理(抛出,中断)
使用格式:
修饰符 返回值类型 方法名(参数类表) throws AAException ,BBException{
throw new AAException(“产生原因”);
throw new BBException(“产生原因”);
}
注意:
1、throws关键字必须写在方法声明处
2、throws关键字后面声明异常必须是Exception或者是Excepiton的子类对象
3、方法内部如果抛出多个异常对象,那么throws后面必须也声明多个异常
如果抛出的多个异常对象有子父类关系,那么直接声明父类异常即可
4、调用了一个声明抛出异常的方法,我们就必须处理声明的异常
要么用throws声明抛出,交给方法的调用者处理,最终给JVM
要么用try……catch 自己处理异常
5、FileNotFoundException是编译异常,抛出编译异常,必须处理异常
可以使用throws声明抛出异常给方法的调用者
try……catch:异常处理的第二种方式,自己处理异常
格式:
try{
可能出现异常的代码
}catch(定义一个异常的变量,用来接收try中抛出的异常对象){
异常的护理逻辑,接收异常对象之后怎么接收异常对象
}
……
catch(异常类名 变量名){

}
注意:
1、try中可能会抛出多个异常对象,那么就可以使用多个catch来处理这些异常对象
2、如果try中产生异常,那么就会执行catch中的异常处理逻辑,执行完毕catch中的处理逻辑后,继续执行try……catch之后的代码
如果try中没有产生异常,那么就不会执行catch中异常的处理逻辑,执行完try中的代码,继续执行try……catch之后的代码

fainlly代码块
格式:
try{
可能出现异常的代码
}catch(定义一个异常的变量,用来接收try中抛出的异常对象){
异常的护理逻辑,接收异常对象之后怎么接收异常对象
}fainlly{
无论是否出现异常都会执行的代码区
}
注意:
1、finally不能单独使用,必须和try一起使用
2、finally一般用于资源释放(资源回收),无论程序是否出现异常,最后都要进行资源释放。

异常中的注意事项:
1、多个异常分别处理
每个异常都用try……catch处理
2、多个异常一次捕获,多次处理
try{
· 有多个异常
}catch(定义异常对象){
处理逻辑
}catch(定义异常对象,此一定是上面异常的父类或间接父类,范围大){
处理逻辑
}
3、多个异常一次捕获一次处理
try{
多个异常
}catch(定义异常对象,一般直接定义Exception类的对象){
处理逻辑
}

子父类异常
1、如果父类抛出多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常
2、父类放发没有抛出异常,子类重写该方法时,也不能抛出异常,此时子类产生该异常,只能捕获处理,不能声明处理。

自定义异常类
java提供的异常类,不够我们使用,需要自己定义一些异常类

格式:
public calss XXXException extends Exception/RuntimeException{
添加一个空参数的构造方法
添加一个带异常信息的构造方法
}
注意:
1、自定义异常类一般都是以Exception结尾,说明该类是一个异常类
2、自定义异常类,必须继承Exception或者RuntimeException
继承Exception,那么自定义的异常类就是一个编译期异常,如果方法内部抛出编译期异常,就必须处理这个异常,用throws 或者,try……catch
继承RuntimeException,那么自定义的异常类就是一个运行期异常,无需处理,交给虚拟机处理(抛出。中断)

自己定义的异常类

public class demo_exception extends Exception {
    public demo_exception(){
        super();//空参数构造方法,调用父类的空参构造方法
    }

    public demo_exception(String message){
        super(message);
    }
}

应用自定义异常类,完成注册异常`

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class sign_in {
    //定义一个map集合记录
    static HashMap<String,String> list=new HashMap<>();
    public static void main(String[] args) {
        list.put("aaa","12345");
        list.put("bbb","12345");
        list.put("ccc","12345");
        list.put("ddd","12345");
        list.put("eee","12345");
        System.out.println(list);
        setin();
    }
    //定义一个让用户输入的方法
    public static void setin(){
        System.out.println("请输入你想注册的用户名");
        Scanner sc=new Scanner(System.in);
        String username= sc.next();
        System.out.println("输入密码");
        String pass= sc.next();

        save(list,username,pass);
        check(list);
    }
    //定义一个存储数据的方法
    public  static void save(HashMap<String,String> map,String name,String pass){
        Set<String> key = map.keySet();
        for ( String s : key ) {
            if(name.equals(s)){
                try {
                    throw new demo_exception("注册失败,用户名已存在");
                } catch (demo_try_catch.demo_exception demo_exception) {
                    demo_exception.printStackTrace();
                   return;
                }
            }
        }
        System.out.println("注册成功");
        map.put(name,pass);

    }
    public static void check(HashMap<String,String> map){
        Set<Map.Entry<String, String>> en = map.entrySet();
        for ( Map.Entry<String, String> str : en ) {
            System.out.println(str.getKey()+"密码是: "+str.getValue());
        }
    }
}

进行结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值