- 首先我们先看一段代码:
package com.jd.vo;
public class Student {
public int age;
}
如果该变量为public级别的变量,则定义Student类的人无法对该变量的范围进行有效的约束 ,这时就属于公共方法操作私有属性
如果定义Student类的人想对该变量的范围进行有效的约束,则此时变量应为private修饰;
我们来看这下面这段代码:
package com.jd.vo;
public 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;
}
}
package com.jd.vo;
public class Test {
public static void main(String[] args) {
Student student =new Student();
student.setAge(100);
System.out.println(student.getAge());
}
}
此时限定了该变量的范围,其他人在对此年龄对象进行操作时,则必须满足if条件,否则输出“年龄无效”;在这里我们思考,在调用该变量的Test类中,当输入的年龄为100时,此时我们只知道年龄无效,并不知道具体哪里出错。思考:这种提示错误的方式对于调用该方法的程序员没有什么过多的直接的帮助,解决方案:throw 异常对象
- throw异常对象
我们想知道代码到底是哪一行出错了,这时候就需要将异常对象抛出
此时在控制台上就会显示出具体的代码行,点击就可以固定到程序异常的代码行,这时便知道自己是哪行代码出错了。但是,这里同样有一个问题,此时我们抛出的对象是jdk已有的运行时异常类,但是这时候和我们自己代码中的age名称却并不是很相符,也就是我们常说的“词不达意”,要想词意一致,这时我们就引入了自定义异常的概念。
- 自定义异常类
为什么?
Java API提供的已有异常类无法准确表述当前发生的异常问题,这时就需要创建自定义的异常。
怎么做?
创建继承Exception 或其子类的自定义类; 自定义异常类调用父类构造函数(通常是含有一个String类型参数的构造函数);
具体创建如下所示,在这里我们先创建一个AgeException的自定义运行异常类:
package com.jd.exception;
public class AgeException extends RuntimeException{
private static final long serialVersionUID = -1829894057306300522L;
public AgeException(String message) {
super(message);
}
}
这时可以清晰地看出,在控制台上显示的结果是词意相符且能追踪到具体错误原因的代码行的
- throw用于抛出异常对象
1、如果异常对象为运行时,则方法参数列表后面可以不使用throws,也可以将异常抛给方法调用者;try-catch
这时我们从代码中可以清晰地看出,此处的Test中的try-catch证明了Student把这个异常抛给了Test的方法调用者,Test的方法调用者捕捉到了这个异常,进而输出了catch后的代码块中的内容。而在运行时异常时,可以不显式对异常的处理,javac依然可以编译程序,而此时用try-catch显式出来了异常;此时在Test里面另外一种抛出该异常的方式是不自己抛出,在方法参数列表后面用throws抛给jvm。
2、如果异常对象为检查时,则方法参数列表后面必须使用throws抛出创建该对象的类;如果没有throws 必须try-cacth
package com.jd.vo;
import com.jd.exception.AgeException;
public class Student {
private int age;
public void setAge(int age) throws AgeException {
if (age>1 && age<20) {
this.age = age;
}else {
throw new AgeException("年龄无效");
}
}
public int getAge() {
return age;
}
}
此时的Student里的AgeException为检查时异常,则就需要在方法列表中抛出,此时是抛给了对方,在这里即是Test的方法调用者,这时的Test则就出现了检查时异常;而如果此时的Student用了try-catch则就表明它自己捕捉到了错误,没有把该检查时异常抛给了方法调用者,即Test
若此时的Student把该检查时异类抛给了方法调用者,而Test也在方法列表中抛出该异常类,此时就表明Test把该检查时异类抛给了jvm
同理,此时的Test在接到该检查时异常后,也可以用try-catch自己捕捉到错误。
- throw与throws的区别:
抛出的东西不同:throw抛出的是具体的异常对象,而throws抛出的是抽象的异常类;
使用位置不同:throw一般用在方法体中,也可用在代码块中,但是如果抛出的是检查时异常类创建的对象,则必 须使用try-catch自行处理;
throws只能用在方法声明括号后面;