我从父级ArrayList返回对象时遇到问题

时间:2019-05-03 10:46:22

标签: java arraylist null

我有4个课程(为方便起见,我将其缩短)。

public class PoliceStation{
public String name;
 ArrayList<Owner> owners = new ArrayList<>();

public boolean addOwner(Owner owner) {
        if(findOwnerID(owner)) {
            this.owners.add(owner);
            System.out.println("Owner "+owner.getName()+" added.");
            return true;
        }
        System.out.println("Owner "+owner.getName()+" with "+owner.getOwnerIDNumber()+" not added.");
        return false;
    }

以及其他一些用于查找所有者对象的类。

Owner类:

import java.util.ArrayList;
public class Owner {
    String name;
    String dateOfBirth;
    long ownerIDNumber;
    String address;
    ArrayList<Vehicle> vehicles=new ArrayList<Vehicle>();
    ArrayList<Fine> penalties = new ArrayList<Fine>();
public Vehicle findVehicleObject(String plateNum) {
    for(int i=0;i<vehicles.size();i++) {
        System.out.println(i);
        if(vehicles.get(i).getPlateNumber().equalsIgnoreCase(plateNum)) {
            System.out.println("Vehicle with that plate number "+plateNum+" exists.");
            return vehicles.get(i);
        }
    }
    System.out.println("Vehicle doesnt exist with "+plateNum);
    return null;
}

由addVehicle方法,findVehicle等组成。

车辆类别:

public class Vehicle extends Owner{
    PoliceStation ps = new PoliceStation("center");

    String plateNumber;
    String name;
    String type;
    //String serialNum;

    public Vehicle(String driverName, String dateOfBirth,long ownerID, String address,String plateNumber, String name, String type) {
        super(driverName,dateOfBirth,ownerID,address);
        this.plateNumber = plateNumber;
        this.name = name;
        this.type = type;
    }

使用findVehicle方法,该方法应返回带有车牌号的车辆对象:

public Vehicle findVehicle1(String plateNum) {
    if(this.plateNumber==plateNum) {
        System.out.println("Lookin "+plateNum);
        return super.findVehicleObject(plateNum);
    }else return null;
}

然后,我有一个名为RadioCam的第四类,它从汽车上读取plateNumber :(注意:以下代码写得不好,因为我一直在努力使它在没有成功)

class RadioCam{
public void detection(double speed) {
    System.out.println("Vehicle detected.");
    //speed would be a variable that the radioCam would return using radiowaves and doppler effect
    if(speed>50) {
        String plateNumber = takePicture();
        Vehicle veh = new Vehicle(plateNumber);
        veh = veh.findVehicle1(plateNumber);//<-- null
        System.out.println("-------------------"+veh.getName());//<- null here as well
        Owner ownerFine = ps.getOwner(veh);
        ownerFine= ps.getOwner(veh);
        System.out.println("sssssss"+ownerFine.getName());
        //ownerFine = PoliceStation.getOwner(veh);
        ps.addFine(ownerFine, "speed violation", veh);//<- so this method doesnt work in the end becuse ownerFine and veh are null

哪个返回null到veh = veh.findVehicle1(plateNumber);。返回到public Vehicle findVehicleObject(String plateNum) { for(int i=0;i<vehicles.size();i++) {的Owner类,<-vehicle.size()为0,所以它根本不会通过车辆。 我知道需要数组列表中的所有者对象才能从数组列表中获取车辆对象,但是在这种情况下,我需要来自PlateNumber(属于Vehicle类的一部分)和车辆对象中的车辆对象拥有车辆对象的所有者对象。

我希望我能很好地解释我的问题。

2 个答案:

答案 0 :(得分:0)

尝试用equals方法比较值,this.plateNumber==plateNum可能为假,即使它们具有相同的值。

public Vehicle findVehicle1(String plateNum) {
    if(this.plateNumber.equals(plateNum)) {
        System.out.println("Lookin "+plateNum);
        return super.findVehicleObject(plateNum);
    }else return null;
}

答案 1 :(得分:0)

在您的findVehicle1(String plateNum)方法中,您将使用==运算符比较两个字符串,而您应该使用string.equals(Object other)

尝试更改

 if(this.plateNumber==plateNum) {

 if(this.plateNumber.equals(plateNum)) {

另外,在构造车辆对象时,您会省略很多必要的参数

public Vehicle(String driverName, String dateOfBirth,long ownerID, String address,String plateNumber, String name, String type) {

^构造函数要求7个参数,而您只给出

new Vehicle(plateNumber);

一个参数。因此,当然,您的veh.getName()方法将返回null,因为它是创建车辆对象时并未维护的属性。

解决这些问题后,您可以考虑您的一般代码结构,例如在哪里实现循环等。

我不知道您是否使用IDE,但是如果您使用IDE,请熟悉调试功能,以逐步遵循被调用方法中的代码执行。您可以很容易地查明以不应该执行的方式执行的代码行(毕竟,您已经找到了方法调用结果为null的行)。