尝试返回值时出错。

时间:2014-10-13 22:53:50

标签: java

我被困在作业的最后一部分。我必须返回一个代理值,但由于某种原因,我不断收到错误说"此方法必须返回类型代理",即使我返回的是代理。任何帮助将不胜感激。

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;
        }


    }


    }

    }

4 个答案:

答案 0 :(得分:1)

方法应该在所有不同的执行路径中返回一个值。您只在else块中返回一个值,这意味着如果未执行else块,则不会返回该值,因此编译器会抱怨它。确保在所有不同的执行路径中返回值,何时未执行if,何时未执行else,何时未执行for循环本身。

答案 1 :(得分:0)

关键是所有执行路径都必须返回Agent类型的值,该值可以为null。像往常一样,调用方法必须检查返回的值是否为null。

现在让我们来看看缺少的内容:

  1. if分支不返回值,而是突然退出。
  2. 如果从未输入for循环,则该方法也不返回任何内容。
  3. 修复所有这些后,整个代码可能是:

    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将退出而无法返回,但在returnagent的情况下,编译器仍需要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;
}