java异常

下面是算术异常。

抛出的异常其实是个类。

下面是空指针异常。

 用异常时,下面语句不会执行。

上面这些是运行时异常

 下面这是编译时异常。

 

在程序编译期间发生的异常,称为编译时异常,也称为受检查异常

在程序执行期间发生的异常,称为运行时异常,也称为非受检查异常。
RunTimeException 以及其子类对应的异常,都称为运行时异常。
注意:编译时出现的语法性错误,不能称之为异常。
1. Throwable 是异常体系的顶层类,其派生出两个重要的子类 , Error Exception。
2. Error 指的是 Java 虚拟机无法解决的严重问题,比如: JVM 的内部错误、资源耗尽等 ,典型代表: StackOverflflowError OutOfMemoryError ,一旦发生回力乏术。
3. Exception 异常产生后程序员可以通过代码进行处理,使程序继续执行。比如:感冒、发烧。我们平时所说 的异常就是Exception

  • 如何抛出异常 

代码触发异常和手动发出异常。

下面是手动触发异常。

注意事项
1. throw 必须写在方法体内部
2. 抛出的对象必须是 Exception 或者 Exception 的子类对象
3. 如果抛出的是 RunTimeException 或者 RunTimeException 的子类,则可以不用处理,直接交给 JVM 来处理
4. 如果抛出的是编译时异常,用户必须处理,否则无法通过编译
5. 异常一旦抛出,其后的代码就不会执行

异常的捕获 

 异常的捕获,也就是异常的具体处理方式,主要有两种:异常声明throws 以及 try-catch捕获处理。

 下面throws后加的意思是告诉编译器这里可能会有异常

 main中的test也需要事先声明异常。

 声明异常后出现异常依然会报错,而且报错后语句不会执行。

处在方法声明时参数列表之后,当方法中抛出编译时异常,用户不想处理该异常,此时就可以借助 throws 将异常抛 给方法的调用者来处理。即当前方法不处理异常,提醒方法的调用者处理异常

可以用逗号声明多个异常。非受查异常也可以声明。

1. throws 必须跟在方法的参数列表之后
2. 声明的异常必须是 Exception 或者 Exception 的子类
3. 方法内部如果抛出了多个异常, throws 之后必须跟多个异常类型,之间用逗号隔开,如果抛出多个异常类型 具有父子关系,直接声明父类即可。

 可以使用try catch处理异常。

 下面这个可以打印错误信息。

 受查异常,没有捕获到就会报错。

异常后直接进入catch,不打印sd。

两行异常可以这样放到一行。

 下面这里用了Exception后,NULL会报错,因为Expection继承了所有异常,能捕获任何异常,把它放到第一个,那么后续异常没有任何问题了。

 try中存在多个异常时,捕获第一个异常。只会抛出一个异常。

如果捕获中没有对应异常的catch,那么异常会交给JVM,程序中断,dff也就不会打印。

 它的退出码是1,代表异常退出。

如果异常之间具有父子关系,一定是子类异常在前catch,父类异常在后catch,否则语法错误

比如不能Expection在第一个catch中。

  • finally 

 

 

 不管try是否抛异常,finally中的代码都会执行。

所以finally一般用于进行资源释放。

 

 根据编译器提示,把scanner写在try中,finally中就没有closel。

 正常来说,finally一定会执行的。

下面这样也会执行finally。

 throw用来抛出异常,throws用来声明异常。

关于 " 调用栈 "
方法之间是存在相互调用关系的, 这种调用关系我们可以用 "调用栈" 来描述. JVM 中有一块内存空间称为
"虚拟机栈" 专门存储方法之间的调用关系. 当代码中出现异常的时候, 我们就可以使用 e.printStackTrace();
方式查看出现异常代码的调用栈.
如果本方法中没有合适的处理异常的方式 , 就会沿着调用栈向上传递。

 

程序先执行 try 中的代码
如果 try 中的代码出现异常 , 就会结束 try 中的代码 , 看和 catch 中的异常类型是否匹配 .
如果找到匹配的异常类型 , 就会执行 catch 中的代码
如果没有找到匹配的异常类型 , 就会将异常向上传递到上层调用者 .
无论是否找到匹配的异常类型 , fifinally 中的代码都会被执行到 ( 在该方法结束之前执行 ).
如果上层调用者也没有处理的了异常 , 就继续向上传递 .
一直到 main 方法也没有合适的代码处理异常 , 就会交给 JVM 来进行处理 , 此时程序就会异常终

 

  • 自定义异常 

 有时候项目很复杂,不能像下面这样通过打印判断异常。这时候就需要自定义异常。

 

 

public class Test2 {
    public  String name = "asd";
    public  int id = 123;
    public void testh(String str, int a) throws UserNameExpection, IdExpection {
        if (!this.name.equals(str)) {
            System.out.println("姓名错误");
            throw new  UserNameExpection();
        }
        if (this.id != a) {
            System.out.println("id错误");
            throw new IdExpection();
        }
    }
    public static void main(String[] args) throws UserNameExpection, IdExpection {
       try {
           Test2 test2 = new Test2();
           test2.testh("asdf", 123);
       }
       catch(UserNameExpection u){
            u.printStackTrace();
           System.out.println("用户名异常");
        }
       catch(IdExpection i)
       {
           i.printStackTrace();
           System.out.println("id异常");
       }
    }
}

我们可以让异常打印特定的内容 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南种北李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值