如何校验接口与实现类构造方法参数一致性及参数对比问题求助
帮你解决构造方法校验与NullPointerException的问题
嘿,我来帮你一步步理清问题,解决你的困惑~
首先,为什么会出现NullPointerException?
你在Car类里定义了public Vehicle v;这个成员变量,但在构造方法里完全没有给它赋值,直接调用v.getName()的时候,v还是null,这必然会抛出空指针异常!而且你根本不需要这个v成员变量——因为Car本身就实现了Vehicle接口,构造方法里直接校验传入的参数就好,不用额外声明一个接口对象。
然后,你的参数校验逻辑有错误
- 字符串的长度永远不可能小于0,所以
v.getName().length() <0这种判断完全无效。你要判断名称是否为空或空白字符串,应该用name.isBlank()(Java 11及以上),或者旧版本用name.trim().length() == 0。 - 你之前写的
if (v.getMaxParameters <0 || maxParameter <0)也是错误的:一来v未初始化,二来方法名是getMaxPassengers不是getMaxParameters,而且直接校验传入的maxPassenger参数就可以了。
关于“需要两个对象设置参数”的困惑
你不需要用两个对象来设置单个Car的参数——构造方法的作用是初始化当前对象的属性,校验的是传入给当前对象的参数是否合法。而你期望的“乘客数不同/名称不同时输出failure”,是两个对象之间的属性对比,这应该在构造完对象之后做,而不是在构造方法里。
修正后的代码示例
1. 修正后的Car类
public class Car implements Vehicle { private String name; private int speed; private int maxPassenger; private double weight; // 去掉多余的Vehicle v成员变量 public Car(String name, int speed, int maxPassenger, double weight) { // 校验名称:不能为空或空白 if (name == null || name.isBlank()) { throw new IllegalArgumentException("名称不能为空或空白"); } // 校验速度:不能小于0 if (speed < 0) { throw new IllegalArgumentException("速度不能为负数"); } // 校验最大乘客数:不能小于0 if (maxPassenger < 0) { throw new IllegalArgumentException("最大乘客数不能为负数"); } // 校验重量:不能小于0 if (weight < 0) { throw new IllegalArgumentException("重量不能为负数"); } // 初始化属性 this.name = name; this.speed = speed; this.maxPassenger = maxPassenger; this.weight = weight; } // 实现Vehicle接口的三个方法 @Override public String getName() { return this.name; } @Override public int getTopSpeed() { return this.speed; } @Override public int getMaxPassengers() { return this.maxPassenger; } // 新增getWeight方法,对应测试代码里的调用 public double getWeight() { return this.weight; } }
2. 修正后的测试代码
public class TestVehicle { public static void main(String[] args) { try { Vehicle v = new Car(" ", 280, 5, 2.1); // 这里名称是空白,会触发异常 Car c = new Car("BMW", 280, 5, 2.1); // 输出属性 System.out.println(v.getName()); System.out.println(v.getTopSpeed()); System.out.println(c.getMaxPassengers()); System.out.println(c.getWeight()); // 对比两个对象的属性,满足条件时输出failure if (!v.getName().equals(c.getName())) { System.out.println("failure"); } if (v.getMaxPassengers() != c.getMaxPassengers()) { System.out.println("failure"); } } catch (IllegalArgumentException ex) { System.out.println("failure"); // 可以打印异常信息方便调试 // ex.printStackTrace(); } } }
关键修改点说明
- 移除了无用的
Vehicle v成员变量,彻底避免空指针问题。 - 修正了参数校验逻辑,比如名称的判断改为检查空/空白,数值类型检查是否小于0。
- 补全了
Vehicle接口要求的所有方法,避免编译报错。 - 在测试代码里添加了两个对象的属性对比逻辑,满足你“乘客数不同/名称不同时输出failure”的需求。
内容的提问来源于stack exchange,提问作者Anika
相关产品推荐
相关产品推荐

