首先讲解一下封装,我们知道,为了控制变量的范围,不被其他程序员随意更改,我们会进行封装操作。
封装操作会限制在为这个变量赋值的程序员,如果范围选择不当,是不可以赋上值的,但是如何让操作这个变量的人知道,这个范围应该是多少呢?总不能一个类一个类的去找,这样太麻烦了,自定义异常类可以解决这个问题。
我们知道,上篇文章讲解了异常的分类,其实每一个异常都是Exception的子类,RuntimeException是Exception的子类。
所以我们完全可以自己创建一个类去继承Exception或者RuntimeException或者检查时异常父类。
我们通过观察这些Exception可以发现这些类中就只有构造方法,含参与无参。所以我们照着创建一个就可以了。创建好了如下图。
如图所示,我们自定义的是一个检查时异常类。
这时,我们就可以通过报错的方式来提醒其他人,并且可以让他们快速的找到自己更改变量所对应的范围。
这就是自定义异常之后的程序页面,这个时候如果输入年龄不在范围之内,程序会发生报错,并且可以通过点击报错来找到范围的位置,从而完成修改。
我们可以注意到,在else代码块里,出现了throw语句。throw是用来干嘛的呢?
throw关键字
定义:throw用于抛出具体异常类的对象,一般用于方法体中。
什么时候使用:当所写的代码因不满足某些条件致使程序无法运行时可以借助throw抛出一个异常对象提醒程序员。就是上图出现的场景。
- throw关键字一般用在方法体中,也可以用在代码块中,但如果代码块中抛出的异常对象是由检查时异常创建的,则必须使用try-catch进行处理;
- 使用throw抛出异常对象如果没有try-catch捕获该异常对象,则该抛出异常对象语句执行后其所在方法结束执行。
我们知道如果为运行时异常,会在程序运行之后进行报错,
如果是检查时异常,编译不能通过,这时就不能够把异常抛出去,所以我们这是就必须要用try-catch将它处理。但是实际上我们并不会自定义检查时异常的异常,因为我们要进行的操作是,提醒其他程序员有错误。这也就是常常说的将异常抛给自己,抛给自己就必须用try-catch来进行处理。
throw抛给方法调用者,这也是我们常常进行的操作,抛给方法调用者之后,方法调用者可以用try-catch进行处理,或者继续上抛该异常。
如果一定想要抛出检查时异常,我们则要运用throws关键字。
总结:throw用于抛出异常对象;
1、如果异常对象为运行时,则方法参数列表后面可以不是使用thrwos,也可以将异常抛给方法调用者去try-catch
2、如果异常对象为检查时,则方法参数列表后面必须使用throws抛出创建该对象的类,如果没有throws 必须try-cacth。
throws关键字
定义:throws用于声明方法可能抛出的异常,其后为异常类,可以有多个,异常类之间用英文逗号间隔。
使用位置:throws只能用在方法声明括号后面。
什么时候使用:
- 当方法体中的throw关键字抛出由检查时异常创建的对象时,如果该异常对象在抛出的同时已经通过try-catch进行了处理,则可以不使用throws,否则必须使用throws抛出创建该对象的异常类或其父类。
- 所调用的方法抛出了检查时异常时,如果该方法在调用的同时已经通过try-catch进行了处理,则可以不使用throws继续上抛该异常,否则必须使用throws才能上抛该异常,此时上抛的异常类可以是调用方法时方法抛出的异常类也可以是其父类。
- 如果方法中的异常已经通过try-catch进行了捕获则无需再使用throws上抛该异常了,否则即使上抛也无效,只会做无用功。因为已经把异常留在了本类中。
总结:
throw与throws的区别:
抛出的东西不同:throw抛出的是具体的异常对象,而throws抛出的是抽象的异常类;
使用位置不同:throw一般用在方法体中,也可用在代码块中,但是如果抛出的是检查时异常类创建的对象,则必须使用try-catch自行处理;