我正在编写一个程序来模拟过程控制块的简单队列,并且在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"));
答案 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时会发生这种情况。