Welcome to the Treehouse Community
Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.
Looking to learn something new?
Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.
Start your free trialDorka Tamas
5,085 PointsBash: hello : command not found - Java Hangman
Hi,
I am facing some issues with Hangman game, what I cannot really figure out. When I start to run the game, it stops after I enter a word and says Bash: hello : command not found. Could you please help? Thanks a lot...
public class Game {
public static final int MAX_MISSES = 7;
private String mAnswer; //What is a member variable?
private String mHits;
private String mMisses;
public char validateGuess(char letter) {
if (! Character.isLetter(letter)) {
throw new IllegalArgumentException("A letter is required.");
}
letter = Character.toLowerCase(letter);
if (mMisses.indexOf(letter) >= 0 || mHits.indexOf(letter) >= 0) //??
{
throw new IllegalArgumentException(letter + " has already been guessed.");
}
return letter;
}
public boolean applyGuess(String letters) {
if (letters.length() == 0) {
throw new IllegalArgumentException("No letter found.");
}
return applyGuess(letters.charAt(0));
}
public Game(String answer) {
mAnswer = answer;
mHits = "";
mMisses = "";
}
public boolean applyGuess(char letter) {
letter = validateGuess(letter);
boolean isHit = mAnswer.indexOf(letter) >= 0;
if (isHit) {
mHits += letter;
} else {
mMisses += letter;
}
return isHit;
}
public String getCurrentProgress() {
String progress = "";
for (char letter : mAnswer.toCharArray()) {
char display = '-';
if (mHits.indexOf(letter) >= 0) {
display = letter;
}
progress += display;
}
return progress;
}
public int getRemainingTries() {
return MAX_MISSES - mMisses.length();
}
public String getAnswer() {
return mAnswer;
}
public boolean isSolved() {
return getCurrentProgress().indexOf('-') == -1;
}
}
import java.io.Console;
public class Prompter {
private Game mGame; //do we need to store?
public Prompter(Game game) {
mGame = game;
}
public void play() {
while (mGame.getRemainingTries() > 0 && !mGame.isSolved()) {
displayProgress();
promptForGuess();
}
if (mGame.isSolved()) {
System.out.printf("Congratulations, you won with %d tries remaining\n",
mGame.getRemainingTries());
} else {
System.out.printf("Sorry, the word was %s. :(\n",
mGame.getAnswer());
}
}
public boolean promptForGuess() {
Console console = System.console();
boolean isHit = false;
boolean isValidGuess = false;
while (! isValidGuess) {
String guessAsString = console.readLine("Enter a letter: ");
try {
isHit = mGame.applyGuess(guessAsString);
isValidGuess = true;
} catch (IllegalArgumentException iae) {
console.printf("%s. Please try again.\n", iae.getMessage());
}
}
return isHit;
}
public void displayProgress() {
System.out.printf("You have %d tries left to try to solve: %s\n", mGame.getRemainingTries(),
mGame.getCurrentProgress());
}
}
public class Hangman {
public static void main(String[] args) {
// Enter amazing code here:
if (args.length == 0) {
System.out.println("Please enter a word");
System.exit(0);
}
Game game = new Game(args[0]);
Prompter prompter = new Prompter(game);
prompter.play();
}
}
[MOD: edited code blocks]
7 Answers
Steve Hunter
57,712 PointsSorry - I didn't make myself clear.
Your main
method - the one that starts the app - takes args
. You pass these in when you call the runtime java
process on the class containing main
. So you've typed in the last part of your command line, java Hangman
. This has no args
. You can add args
by adding them inside parentheses like, as I suggested above, Hangman(
"hello
")
- that passes the string 'hello' into the process, with that string being held as an arg
; as it is the first one, it'll be args[0]
, the second will be args[1]
etc. It is just an array of arguments - a bit like a Saturday night on the Stella.
Getting back to your app - as you run your code, your first line inside the main
method checks to see if any args
were passed in. If they weren't, that means args.length == 0
(which it is) and the lines of code inside the if
statement are executed. That's where the System.exit(0)
line exits the whole process. So, if you did pass an arg
to the method at the beginning, args.length
would not be zero and that exit(0)
line would not be executed. Your application may then run properly!
For the sake of ease; call your program with an args
present. Else you need to figure out reading user input and passing that into the Game
constructor. That's not hugely difficult, but it is way easier to just pass an argument in:
treehouse:~/workspace$ javac Hangman.java && java Hangman("hello")
Make sense?
Steve.
Steve Hunter
57,712 PointsHi Dorka,
Apologies for the delay in replying; I was at work.
Assuming you've not got through this issue, the error should tell you what line the error occurred on? And when is this error occurring?
That should help me pin down what the issue is. The app seems to be treating a string as a command, so there may be something simple missing like some inverted commas.
Let me know, and I'll help you out.
Steve.
Steve Hunter
57,712 PointsYes, change this:
if (args.length == 0) {
System.out.println("Please enter a word");
System.exit(0); // <-- this throws you out of the app!!
}
If you don't open the application and pass a string to it, the app prompts you for a string - it never reads input and immediately exits the process wth System.exit(0)
.
You need a readLine()
instead of the println
and you need to delete the exit command.
Try starting your app with:
javac Hangman.java && java Hangman("hello")
That should work, but might throw another error. Try it and then we'll try to fix your app.
Steve.
Dorka Tamas
5,085 PointsThanks Steve for the reply! Unfortunately, I could not solve it yet.
It seems to me that it is a runtime error, it does not tell me where it is the problem, It runs, it asks me to enter a word, I entered hello and then it says Bash: hello : command not found.
So I am still confused how to deal with it. :(
Thanks for everything!
Steve Hunter
57,712 PointsCan you post a screenshots of the workspace before and after the error, please?
Steve Hunter
57,712 PointsWhen you call the Hangman class from the command prompt, are you surrounding the word hello with double quotes? You must treat it as a string - are you doing that? For some reason the word hello is being treated as a keyword, not a string.
Dorka Tamas
5,085 PointsSorry I cannot figure out how to insert it, but u can read exactly this:
treehouse:~/workspace$ javac Hangman.java && java Hangman Please enter a word treehouse:~/workspace$ hello bash: hello: command not found
Dorka Tamas
5,085 PointsI did not put it with "", but I tried it now, still the same answer.
treehouse:~/workspace$ javac Hangman.java && java Hangman
Please enter a word
treehouse:~/workspace$ hello bash: hello: command not found
Steve Hunter
57,712 PointsShare your workspace - let me have a try at this end.
Stee.
Steve Hunter
57,712 PointsThe app is ending after it outputs 'Please enter a word' - that's why you're at the command prompt. Let's see what's wrong there ...
Dorka Tamas
5,085 PointsHi Steve,
It is working now :)
Thanks a lot for putting so much efforts into it, now I understand the logic behind it! I really appreciate your help!
Steve Hunter
57,712 PointsHey, no problem; glad to help out!
Steve Hunter
57,712 PointsSteve Hunter
57,712 PointsBut, as above, share your workspace and we can walk through the changes needed.