Search code examples
javarecord

How do I access a record from another procedure?


So I am having an issue where I would like to create a record in one procedure, then alter the attributes of that record using other procedures and functions.

  import java.util.Scanner; // Imports scanner utility
  import java.util.Random;
  import java.lang.Math;

  class alienPet
  {
      public void main (String[] param)
      {
          // We want to call all of the functions
          // and procedures to make an interactive
          // alien program for the user.

          welcomeMessage();
          alienCreation();

          System.exit(0);

      } // END main

        /* ***************************************
        *   Define a method to obtain the users input
        * and start the correct method.
        */

        public static String userInput (String message)
        {
          Scanner scan = new Scanner(System.in);
          String inp;
          print(message);
          inp = scan.nextLine();
              return inp;
        } // END userInput

        /* ***************************************
      * Define a method to print messages.
      */

      public static void print (String message)
      {
          System.out.println(message);
          return;
      } // END print

      /* ***************************************
      * Define a method to 
      */

      public static void welcomeMessage ()
      {
        print("Thank you for playing the pet alien game");
        print("In this game, you will have to look after your own alien.");
        print("There is multiple aspects to looking after your alien, such as:");
        print("Hunger, Behaviour and Thirst."); 
        print("");
        print("When prompted, you can use the following commands:");
        print("feed -> Replenishes alien to max hunger level");
        print("drink -> Replenished thirst level to max");
        print("");
          return;
      } // END 


      /* ***************************************
      * Define a method to 
      */

      public void alienCreation ()
      {
        Alien ufo = new Alien();
        ufo.name = userInput("What would you like to name your new alien?");
        ufo.hungerRate = ranNum(1, 6);
        print("On a scale of 1-6, your alien, " + ufo.name + ", has a hunger rate of " + ufo.hungerRate);
        alienBehaviour(ufo.hungerRate);
          return;
      } // END alienCreation

      public void alienBehaviour (int hunger) {
          if (hunger <= 2){
              print(ufo.name + " is very hungry, and is dangerously angry!!");
              String action = userInput("You should feed it as soon as possible. (by typing 'feed')");
              if (action.equals("feed")){
                  feedAlien();
              }else if (action.equals("drink")) {
                  alienDrink();
              }else{
                  print("That is a dangerous decision.");
              }
          }else if (hunger <= 4) {
            print(ufo.name + " is mildly hungry, but is in a calm state.");
              String action = userInput("Would you like to take any actions?");
              if (action.equals("feed")){
                  feedAlien();
              }else if (action.equals("drink")) {
                  alienDrink();
              }else{
                  print("Okay.");
              }
          }else if (hunger <= 6) {
            print(ufo.name + " is not hungry and is in a happy state.");
              String action = userInput("Would you like to take any actions?");
              if (action.equals("feed")){
                  feedAlien();
              }else if (action.equals("drink")) {
                  alienDrink();
              }else{
                  print("Okay.");
              }
          }
      }

      public void feedAlien() {
          ufo.hungerRate = 6;
          print(ufo.name + "'s hunger level replenished to max level 6.");
          print(ufo.name + " is now at a happy level.");
      }

      public void alienDrink() {
        ufo.thirst = 6;
        print(ufo.name + "'s thirst level replenished to max level 6.");
    }

      public static int ranNum(int min, int max){ // A function that generates a random integer wihin a given range.
        Random random = new Random();
        return random.ints(min,(max+1)).findFirst().getAsInt();
    } // END ranNum

  } // END class alienPet

  class Alien {
      String name;
      int age = 0;
      int hungerRate;
      int thirst = 6;
  }

Obviously, some of the annotations are incomplete as of this time, but the issue I am having is in the alienBehaviour(), feedAlien() and alienDrink() procedures, I cannot seem to access the record created in the alienCreation() procedure. The errors are all the same and is as follows:

alienPet.java:84: error: cannot find symbol
              print(ufo.name + " is very hungry, and is dangerously angry!!");
                    ^
  symbol:   variable ufo
  location: class alienPet

Now I am new to java, so I'm not sure whether I have to make the record global or something, so any help would be greatly appreciated.


Solution

  • Variables declared inside of a method are called local variables and are likely disposed of when the method finishes executing.

    Variables declared outside any function are called instance variables and they can be accessed (used) on any function in the program.

    You are looking for an instance Alien ufo variable.

    class alienPet{ // It is recommended you use the java naming convention.
        Alien myAlien = new Alien();
        // alienPet a = new alienPet();
        // a.myAlien; // you could potentially do this to get an alien from an alienPet class
        void someVoid(){
            Alien otherAlien;
        }
        void errorVoid(){
            otherAlien.toString(); 
    // causes an error, the otherAlien variable is never visible to errorVoid as it is a local variable
            myAlien.toString(); // OK
        }
    }
    

    https://www.oracle.com/technetwork/java/codeconventions-135099.html