My suspicions were realized when I added <b>inventory.newinv[3].getInvName()</b> to the print of the inventory and I got a null pointer exception.
Why would the newly created inventory not save??
*edit
Also if I add the for loop to the part of the program that adds a new inventory it prints correctly. So I am thinking that after the somehow reprinting the menu is causing that spot in memory to be erased.
In order to print the menu, the user has to make a new selection, during this process the new inventory item is being losed...
I am not too worried about public or private at this point.
Also I am sure that I am creating the new inventory item correctly because it outputs fine with the for loop right after creating the inventory.
It isent until the user is redirected back to the main menu, that the new inventory seems to disappear and I am only left with the initial inventory that I have hard coded.
THis is where I have hardcoded my original inventory
And this is the inventory class
I have narrowed it down to being an issue with the following code
This allows the user to enter the new inventory item by selecting 2 from the MAIN MENU, and then return to the main menu to select 1 to print the inventory. At some point when the user returns to the main menu the new array element is lost. I know the array is correct prior to this because I added the for loop that is used to print the inventory(currently in selection1) to the if statement for selection 2 and it prints the full inventory.
Thanks for looking into this one, I am totally lost. I was told the garbage collector was a great feature, but it looks like the garbage was brought to the road too soon in this program.
Mike Osterhout wrote:THis is where I have hardcoded my original inventory
Thanks for looking into this one, I am totally lost. I was told the garbage collector was a great feature, but it looks like the garbage was brought to the road too soon in this program.
The odds that garbage collection is in any way responsible or even involved in this error are exceedingly small. It is likely that there's an error in your code, perhaps in code you've not posted yet.
I am not sure if this will help, but this is my complete suboption class. It simply gets the users selection and acts on it similar to the way the main menu works. This submenu is only printed if the correct option is selected from the main menu.
Mike Osterhout wrote:I am not sure if this will help, but this is my complete suboption class.
Hard to say as there are several other classes that this depends on that we don't have available.
Here are some problems that I'm seeing off the bat, that perhaps have nothing to do with your original question/problem:
1) Submenu seems to be used as both an object and a class with static methods:
I'm sure that you remember our previous discussion about use and abuse of statics. Again, avoid them unless you know for certain that you should be using them here. Having said that, the subInput method itself is static, and I have to wonder why. Is it being called straight off of the main method?
2) there's a Newinv method being called, startInv3, that is not found in the Newinv code.
3) Here,
you're wandering off in to recursion. Are you sure that you want the subInput method to call itself recursively? This can lead to big-time badness. In fact, you appear to be doing this a lot, and I have to wonder if this is your main problem. When you call a method recursively, it creates all new local variables and so many Newinv objects may be created, one with a 3rd item, others (probably the one you care about), not. I would strongly advise you to get rid of recursion.
I get the feeling that there is a lot of redundancy in this code including the many classes with the term "menu" in them, that it can be simplified greatly and that this would make debugging much easier.
My main recommendation here is to scrap this class and start afresh, but to plan out what you are going to do before trying to commit code to IDE.
Yeah, way back somebody attempted to help me with the recursion issue. I was just not understanding how with those if statements I could include the class only once. Also you are right about getting rid of some of the classes. Even though I have 3 menus, they should all be in one class, and even tho I have 3 option/if then statements there should only be 1 option class.
I am just confused as to how I could write those if statements and not include the, print menu/ option/ selection code over and over again.
If I can understand that I think it would be wise to rewrite this...
Recursion is your main issue here, so I'm going to try to illustrate the recursion problem with a simplified version of your program. Say in place of Inventory, I have a simple FooInventory class like so:
Now say I create a SubOptionSimple class that somewhat mimicks yours:
Now let's walk through my SubOptionSimple and see what happens.
1) The main method first calls the static subInput method, and it creates a FooInventory array called fooInvs that has places for 100 FooInventory items. When the array is created, all items in the array are initially set to null.
2) I then initialize the first two items in this array, items 0 and 1 with the names Pete and Mike (they sounded good for some reason).
3) I next display my menu String and which requests input.
4) Assuming that the user types "2", then enter, then my first if block is run. It asks the user to enter a name, (say he enters "John") accepts the String, then creates the third FooInventory item (fooInvs[2]) using this String, updating my array.
5) It then does something bad, it calls subInput recursively. This restarts the subInput method from the beginning which creates a new FooInventory array that is completely different from the one we've been working with. This point is very important (which is why I've italicized it). It displays the menu String requesting user input.
6) Say the user chooses "3" causing the else if (....'3') block to run, this menu will then use a for loop to loop through and display the contents of the new fooInvs FooInventory array, an array which has not received the input in the if block above it.
Do you see how this will cause your program to fail?
Ya, I understand that. In my mind I would think that the inventory class would save separately from the menu/selection but it appears that my recursion is causing the inventory to be reset.
So my solution is to start from the beginning. These are the 3 classes that will be the foundation to all of my menus in this program.
From there I will just need the inventory classes.
Right now I am having a problem with some more recursion and I think it starts from my Run class. The program prints the complete menu twice each time before printing which selection was chosen.
This is the new menu class, I am going to attempt to use one function to both print the menu and grab the selection.
This is my new extremely simplified option class that I will attempt to remove the recursion from
Lastly this is the run class that I think is giving me my issue
When I actually run the program, it reprints the menu twice everytime... This is the same issue that I was having with my option class.
If I can get this figured out, hopeful I can do the same with my option class and I will report back...
Mike Osterhout wrote:Ya, I understand that. In my mind I would think that the inventory class would save separately from the menu/selection but it appears that my recursion is causing the inventory to be reset.
that would perhaps be the case if the array were defined outside of the method, but regardless if this would cause a temporary fix, the right answer is not to use recursion here. A while loop works so much better and is much safer.
Mike Osterhout wrote:
Lastly this is the run class that I think is giving me my issue
When I actually run the program, it reprints the menu twice everytime... This is the same issue that I was having with my option class.
If I can get this figured out, hopeful I can do the same with my option class and I will report back...
You call menu.Main() from within the option class, and it gets and returns input for you. Why are you calling it in the main method above only to discard the input? Get rid all references to Menu in this class above. Also, don't forget to put a while loop in your Option code.
I was thinking to myself before I commented out the menu in the Run class, there is no way that this going to work b/c the program wont know to print the menu.
However when I created the selection integer, I also create the new menu and as it turns out that has been a cause to my problems. Also that was one reason I was having a hard time with the static vs non static stuff.
In the end to anyone who reads this, be careful when using public methods that output to the screen... *<-edit it is mostly tricky when that output also returns a value.
I think I said that right, now for implementing this while loop...