我被困在作业的最后一部分。我必须返回一个代理值,但由于某种原因,我不断收到错误说"此方法必须返回类型代理",即使我返回的是代理。任何帮助将不胜感激。
import java.io.File;
import java.util.HashMap;
import jeff.ini.Ini;
public class ConfigLoader
{
private Ini _ini;
private HashMap<String, Space> _spaces = new HashMap<String, Space>();
private HashMap<String, Portal> _portals = new HashMap<String, Portal>();
private HashMap<String, Agent> _agents = new HashMap<String, Agent>();
public ConfigLoader(File iniFile)
{
_ini = new Ini(iniFile);
}
public Agent buildAll()
{
_buildSpaces();
_buildPortals();
_buildExits();
_buildDestinations();
_buildAgents();
return _selectStartAgent();
}
private void _buildSpaces(){
for(String spaceName : _ini.keys("spaces")){
String descrip= _ini.get("spaces", spaceName);
String image= _ini.get("images", "images");
Space space1= new Space(spaceName, descrip, image, null);
_spaces.put(spaceName, space1);
}
}
private void _buildPortals(){
for(String portalName : _ini.keys("portals")){
String descrip= _ini.get("portal", portalName);
Portal portal1=new Portal(portalName, descrip, null);
_portals.put(portalName, portal1);
}
}
private void _buildExits(){
for(String spaceName : _ini.keys("exits")){
String spaceExit = _ini.get("exits", spaceName);
Space space = _spaces.get(spaceName);
Portal exit = _portals.get(spaceExit);
space.setPortal(exit);
}
}
private void _buildDestinations(){
for(String portalName : _ini.keys("destinations")){
String destination = _ini.get("destinations", portalName);
Space des = _spaces.get(destination);
if(des == null){
System.out.print("ERROR");
System.exit(1);
}
else{
Portal portal = _portals.get(portalName);
portal.setDestination(des);
}
}
}
private void _buildAgents(){
for(String agentName : _ini.keys("agents")){
String agent = _ini.get("agents" , agentName);
Space space = _spaces.get(agent);
if(space == null){
System.out.print("ERROR");
System.exit(1);
}
else{
Agent a = new Agent(space, agentName);
_agents.put(agentName, a);
}
}
}
private Agent _selectStartAgent(){
for(String agentName : _ini.keys("start")){
String agent = _ini.get("start" , agentName);
Agent agent1 = _agents.get(agent);
if(agent == null){
System.out.print("ERROR");
System.exit(1);
}
else{
return agent1;
}
}
}
}
答案 0 :(得分:1)
方法应该在所有不同的执行路径中返回一个值。您只在else
块中返回一个值,这意味着如果未执行else
块,则不会返回该值,因此编译器会抱怨它。确保在所有不同的执行路径中返回值,何时未执行if
,何时未执行else
,何时未执行for
循环本身。
答案 1 :(得分:0)
关键是所有执行路径都必须返回Agent类型的值,该值可以为null。像往常一样,调用方法必须检查返回的值是否为null。
现在让我们来看看缺少的内容:
if
分支不返回值,而是突然退出。for
循环,则该方法也不返回任何内容。 修复所有这些后,整个代码可能是:
for (String agentName : _ini.keys("start")){
String agent = _ini.get("start" , agentName);
Agent agent1 = _agents.get(agent);
if (agent == null){
System.out.print("ERROR");
return null;
} else {
return agent1;
}
return null;
}
答案 2 :(得分:0)
_selectStartAgent
方法的问题在于return
并非在所有情况下都执行。您可以在此方法中调用System.exit(1)
,但编译器并不关心;它认为这是另一种方法调用。即使由于JVM将退出而无法返回,但在return
为agent
的情况下,编译器仍需要null
。
您可以在return null;
之后放置System.exit(1)
。但是,这种方法不应该处理错误。它只需要报告错误。只需让它返回null
(或让它抛出异常)。
if(agent == null){
return null;
// or
// throw an exception here
}
调用_selectStartAgent
的方法应检查null
(或处理异常,具体取决于您选择的内容)。
此外,编译器并不假设会有任何for
循环的迭代。那里也没有return
。您可以在return
循环后放置for
语句,以确保在return
循环没有迭代时存在for
。
答案 3 :(得分:0)
我认为如果你的for循环没有任何东西要循环,那就与它有关。在这种情况下,您没有退货声明。
尝试在for循环后添加return null。
private Agent _selectStartAgent(){
for(String agentName : _ini.keys("start")){
String agent = _ini.get("start" , agentName);
Agent agent1 = _agents.get(agent);
if(agent == null){
System.out.print("ERROR");
System.exit(1);
}
else{
return agent1;
}
}
return null;
}