使用多个类的不兼容返回类型

时间:2019-03-20 21:49:13

标签: java

我正在编写一个程序来模拟过程控制块的简单队列,并且在returnPcb()方法中遇到返回值问题。我收到“无效的返回类型”。我知道我方法中的返回类型是Pcb,但是我不能更改它。如果对removePcb()的调用为false,我想返回-1的值。我的想法是创建一个新的Pcb,将值设置为-1,然后返回该值。这是我遇到问题的地方。当条件为假时,我需要返回-1的帮助。谢谢。

MasterQueue类:

import java.util.*;

public class MasterQueue {

    HashMap<String,Queue<Pcb>>hash;

    MasterQueue(){
        hash = new HashMap<>();
    }

    public boolean addQueue(String nameIn){
        String QueueName = nameIn;
        if(hash.containsKey(QueueName)){
            return false;
        }
        //else add new queue the hashmap
        else{
            Queue<Pcb> q = new LinkedList<>();
            hash.put(QueueName,q);
            return true;
        }
    }

    public boolean addPcb(Pcb p,String nameIn){
        String PcbName = nameIn;
        //if queue exist in the list then add the pcb to it
        if(hash.containsKey(PcbName)){
            hash.get(PcbName).add(p);
            return true;
        }
        //else return false
        else{
            return false;
        }
    }

    public Pcb removePcb(String nameIn){
        String RemovePcbName = nameIn;
        //if this queue exist in the list then remove first element from the queue
        if(hash.containsKey(RemovePcbName)){
            return hash.get(RemovePcbName).remove();
        }
        Pcb p = new Pcb(0, 0, 0, -1);
        return p.getPid();
    }

}

PCB类:

public class Pcb {


private int low;
private int high;
private int state;
int pid;

Pcb(int lowMemIn, int highMemIn, int stateIn, int pidIn){
    setLowMem(lowMemIn);
    setHighMem(highMemIn);
    setState(stateIn);
    setPid(pidIn);
}

public void setLowMem(int lowMemIn){
    low = lowMemIn;
}

public int getLowMem(){
    return low;
}

public void setHighMem(int highMemIn) {
    high = highMemIn;
}

public int getHighMem(){
    return high;
}

public void setState(int stateIn){
    state = stateIn;
}

public int getState() {
    return state;
}

public void setPid(int pidIn){
    pid = pidIn;
}

public int getPid(){
    return pid;
}
}

测试

@Test
public void testAddPcb1() {
    Pcb pid1 = new Pcb(1, 2, 3, 4);
    MasterQueue mq1 = new MasterQueue();
    mq1.addQueue("miniQueueStr");

    Assert.assertTrue("error", mq1.addPcb(pid1, "miniQueueStr"));

1 个答案:

答案 0 :(得分:1)

您的方法当前定义为:

public Pcb removePcb(String nameIn){
    String RemovePcbName = nameIn;
    //if this queue exist in the list then remove first element from the queue
    if(hash.containsKey(RemovePcbName)){
        return hash.get(RemovePcbName).remove();
    }
    Pcb p = new Pcb(0, 0, 0, -1);
    return p.getPid();
}

因此您向编译器保证此代码将返回Pcb对象,而没有其他返回。您不能只是决定让它返回其他内容,而是必须是一个Pcb对象。

这样做:您定义了失败情况Pcb p = Pcb(0,0,0,-1),因此只需在函数末尾返回p,编译器就会满意。

但是,如果没有匹配的Pcb,您实际上不应该返回一个Pcb对象,而该对象恰好被设置为您假定具有意义的值,而没有正式将其声明为某个常量,这时事情变得很愚蠢。 。您可能要做的是抛出函数:

public Pcb removePcb(String nameIn) throws NoSuchElementException {
    String RemovePcbName = nameIn;
    //if this queue exist in the list then remove first element from the queue
    if(hash.containsKey(RemovePcbName)){
        return hash.get(RemovePcbName).remove();
    }
    throw new NoSuchElementException();
}

然后在您使用的代码中,将该移除调用放入try / catch中,并执行您作为程序员所知道的事情,当某人尝试移除不存在的Pcb时会发生这种情况。