Farshad Chowdhury
Farshad Chowdhury

Reputation: 41

Error while trying to return a value.

I'm stuck on the very last part of my homework. I have to return an Agent value, but for some reason I keep getting an error saying that "This method must return type Agent", even though what I am returning is an Agent. Any help would be greatly appreciated.

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


    }


    }

    }

Upvotes: 1

Views: 72

Answers (4)

Peter Pei Guo
Peter Pei Guo

Reputation: 7870

The key is that all execution paths must return a value of type Agent, which could be null. The calling method must, as usual, check whether the returned value is null.

Now let's look at what are missing:

  1. The if branch does not return a value, instead it abruptly exits.
  2. If the for loop is never entered, the method does not return anything either.

With all those fixed, the entire code could be something like:

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

Upvotes: 0

Andrew Alderson
Andrew Alderson

Reputation: 903

I believe it has to do with if your for loop doesn't have anything to loop through. In that case, you have no return statement.

Try adding return null after the for loop.

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

Upvotes: 0

rgettman
rgettman

Reputation: 178243

The problem with your _selectStartAgent method is that a return isn't executed in all cases. You do call System.exit(1) inside this method, but the compiler doesn't care; it sees that as another method call. Even if it won't return because the JVM will be exited, the compiler still requires a return in the case where agent is null.

You could just place a return null; after System.exit(1). However, this method shouldn't be handling an error. It just needs to report the error. Just have it return null (or have it throw an exception).

if(agent == null){
    return null;
    // or
    // throw an exception here
}

The method that calls _selectStartAgent should check for null (or handle the exception, depending on which you choose).

Additionally, the compiler doesn't assume that there will be an iteration of any for loop. There is no return there either. You can place a return statement after the for loop, to ensure that there is a return when there is no iteration of the for loop.

Upvotes: 0

Juned Ahsan
Juned Ahsan

Reputation: 68715

A method should return a value in all the different execution path. You are returning a value only in else block, which means in case when else block is not executed the value will not be returned and hence compiler complains for it. Make sure that you return a value in all different execution path, when if is not executed, when else is not executed, when for loop itself is not executed.

Upvotes: 1

Related Questions