一、封装
背景:在定义一个供用户使用的属性时,使用public修饰的属性无法对属性的取值进行限制,此时就需要封装
ublic class Student {
private int age;//设置访问权限使其值可控
public void setAge(int age) {
if(age>1&&age<20){
this.age =age;
}else{
System.out.println("年龄无效");
}
}
public int getAge() {
return age;
}
}
此时我们可以通过在类中定义如图,这种封装形式就可以限制用户使用时的范围
二、throw 与 throws
背景:在使用封装时,当用户输入错误的值后,应弹出相应的错误提示和地址;
1、包装的错误提示的追踪
我们想到用提示异常的方法来进行追踪:
此时我们在封装中加入:
public void setAge(int age) {
if (age>1&&age<20) {
this.age = age;
}else {
throw new NullPointerException("代码无效");
}
}
public int getAge() {
return age;
}
此时使用throw把方法中的运行时异常抛到用户界面中
Exception in thread "main" java.lang.NullPointerException: 代码无效
at www.jd.student.Student.setAge(Student.java:12)
at www.jd.book.Book.main(Book.java:8)
2、创建新异常
背景:上述异常弹出的是自己输入的//空指针代码,和年龄明显不符,下面我们就需要通过继承重新定义异常
一、运行时异常
public class AgeException extends RuntimeException {
private static final long serialVersionUID = -8523414367897761594L;
public AgeException(String message) {
super(message);
}
}
继承的RuntimeException(运行时)方法,通过super把父类中的输出错误的方法进行调用,此时就创建了与年龄相对应的新的运行时异常类,此时需要自动生成一个ID,现在不解释;
public void setAge(int age) {
if (age>1&&age<20) {
this.age = age;
}else {
throw new AgeException("无效年龄");
}
}
运行结果:
Exception in thread "main" www.jd.exception.AgeException: 无效年龄
at www.jd.student.Student.setAge(Student.java:11)
at www.jd.book.Book.main(Book.java:8)
此时显得十分合理
二、检查时异常
将上述代码继承的父类改写成为非运行时父类的既可以成功创建检查时异常类。
public class AgeException extends Exception {
private static final long serialVersionUID = -8523414367897761594L;
public AgeException(String message) {
super(message);
}
}
3、throw 与 throws
背景:在封装方法中检测到错误时,需要将错误信息抛到用户执行界面,使用户得到其对应的信息,此时就需要用到throw、throws进行抛掷;
一、抛掷的位置
抛给自己:在使用throw时可以将对象在本类中通过try{ }catch(){ }抛在本类中;
public void setAge(int age) {
if (age>1&&age<20) {
this.age = age;
}else {
try{
throw new AgeException("无效年龄");
}catch(AgeException e) {
e.printStackTrace();
}
}
}
这是在用户类中检查时就不会执行try catch {}中的代码(说明仅仅抛给了本类)
抛给外类(只要使异常不抛给本类,就会抛给外类)
一、运行时异常
在异常为运行时异常的情况下,直接使用throw将异常对象抛到用户界面(不需要显示处理)
二、检查时异常
此时异常行为检查时异常,必须使用throws(放在方法后面括号前面)将其类名抛出才行
public void setAge(int age)throws AgeException {
if (age>1&&age<20) {
this.age = age;
}else {
throw new AgeException("无效年龄");
}
}
三、代码块:
代码块中不可以抛出检查时异常
如图方式不成立
四、总结:
throws必须出现在抛出检查时异常,其抛出的是异常类
throw抛出的是异常方法