学习Java异常

大家平时在写代码的时候可以会遇到程序报错。报错一共有两种,一种是Error,一种是Exception,Error和Exception都是Throwable类的子类

什么是Error:错误表示不应该发生的异常情况。发生严重问题时抛出错误。此外,错误被视为未经检查的异常,应用程序不应该试图捕获和处理它们。此外,错误发生在运行时,并且无法恢复。

Exception分两种:一种是运行时异常,一种是编译时异常

运行时异常:RuntimeException及其子类是在Java虚拟机运行时可以抛出的异常。这些异常一般是由程序逻辑错误引起的。此外,它们是未经检查的异常。如果可以在方法执行后抛出未检查的异常并传播到方法的作用域之外,则不需要在方法签名中使用throws关键字声明这些异常。

编译时异常:从语法角度讲是必须处理的异常,比如说要访问一个文件,Java IO库会强制检查FileNotFoundException。

怎么抛出异常

使用关键字throw,抛出一个指定的异常对象。

throw new XXXException("异常产生的原因")

public static void func(int[] arr) throws NullPointerException{
        if(arr == null){
            throw new NullPointerException();
        }
    }

注意事项

 throw必须写在方法体内部

抛出的对象必须时Exception或者Exception的子类对象

如果抛出的是RunTimeException或者RunTimeException的子类,则可以不用处理,直接交给JVM来处理

如果抛出的是编译时异常,程序员必须处理,否则无法通过编译

异常一旦抛出,其后的代码就不会执行

怎么处理异常

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

public static User Login() throws UserNameException, PasswordException{
    //UserNameException和PasswordException是自定义异常
}

格式:

修饰符 返回值类型 方法名(参数列表) throws 异常类型1,异常类型2... {

}

 注意事项:

throws必须跟在方法的参数列表之后

声名的异常必须是Exception或者Exception的子类,上面的自定义异常都是继承了RuntimeException,是Exception的子类

方法内部如果抛出了多个异常,throws之后必须跟多个异常类型,之间用逗号隔开,如果抛出的异常类型具有父子关系,直接声名父类即可。

调用声名抛出异常的方法时,调用者必须对异常进行处理,或者继续使用throws抛出。

捕获处理异常 try-catch

try{
   // 将可能出现异常的代码放在这里
}catch(要捕获的异常类型  e){
      // 如果try中的代码抛出异常了,此处catch捕获时异常类型与try中抛出的异常类型一致时,或者是try中抛出异常的基类时,就会被捕获到
      // 对异常就可以正常处理,处理完成后,跳出try-catch结构,继续执行后序代码
}catch(要捕获的异常类型  e){

}finally{
       // 此处代码一定会被执行到
}
 
// 后序代码
// 当异常被捕获到时,异常就被处理了,这里的后序代码一定会执行
// 如果捕获了,由于捕获时类型不对,那就没有捕获到,这里的代码就不会被执行

当try中包含多个异常时,用多个catch捕获不同的异常。

注意事项

try块内抛出异常位置之后的代码将不会执行

如果异常之间具有父子关系,父类一定要写在子类的后面

finally

有些代码不管程序是否发生异常都需要执行,finally就是做这个的

用于资源的回收。或者触发异常进行程序的跳转导致某些语句执行不到。

自定义异常

可以根据需求继承Exception,其中有这样一个构造方法

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

在写自定义异常的构造方法时一定会调用父类的构造方法。这里面的传参message可以对printStackTrace()方法打印的字符串进行赋值。所以在throw new myException(" .....")的时候可以打印自己自定义的报错信息。只需要在自定义异常里写一下构造方法就行。

public class UserNameException extends RuntimeException{
    public UserNameException(String message) {
        super(message);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值