如果抛出和尝试之间的区别

时间:2017-10-28 12:30:36

标签: java if-statement exception try-catch throw

我一直在使用Team Tree house和其他方法来学习Java。在其中一个视频中,我们制作了一个使用抛出异常的IF语句。没什么好疯狂的。事情是,当我在它上面创建时仍然会抛出疯狂的长信息。只是为了澄清没有谈论使用try catch这里只是使用if来抛出异常。一个完美的例子是如果获得输入并想要检查输入是否为空白。如果它的空白抛出异常说它的空白。好消息有效,我只是得到了长信息。那我怎么才收到我的信息呢?我已编辑帖子以包含以下代码。下面的代码是一个简单的刽子手游戏。现在我完全理解try catch方法是如何工作的,当我在自己的程序中使用带有throw异常的if语句时,它会抛出整个丑陋的消息。在这个程序上它只会抛出自定义消息,如果你看起来你会看到它没有包装在try catch方法中。

package hangMan;
import java.util.Scanner;    

public class hangMan {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("What word would you like to guess? ");
        String guessWord = input.nextLine();
        for(int i = 0; i < 10; i++){
            System.out.println("");
        }

        //create objects for game and prompter class

        Game game = new Game(guessWord);
        Prompter prompter = new Prompter(game);

        while(game.getRemainingTries() > 0 && !game.isWon()){
        prompter.displayProgess();
        prompter.promptForGuess();
        }
        prompter.displayOutcome();
    }

}

package hangMan;

public class Game {
public static final int MAX_MISSES = 7;
private String answer;
private String hits;
private String misses;

//constructor set answer when created
public Game(String answer){
    this.answer = answer;
    hits = "";
    misses = "";


}

public void setAnswer(String answer){
    this.answer = answer;
}

public boolean applyGuess(String letters){
    if(letters.length()==0){
        throw new IllegalArgumentException("No leter found");
    }
    return applyGuess(letters.charAt(0));
}
private char normalizedGuess(char letter){
    if(! Character.isLetter(letter)){
        throw new IllegalArgumentException("Not a letter");
    }
    letter = Character.toLowerCase(letter);
    if(misses.indexOf(letter) != -1 || hits.indexOf(letter)!= -1){
        throw new IllegalArgumentException("You already guessed that letter");

    }

    return letter;
}

public String getAnswer (){
    return answer;
}

//apply guess method get letter to check with answer
public boolean applyGuess(char letter){
    letter = normalizedGuess(letter);
    //checks if letter is in answer
    boolean isHit = answer.indexOf(letter) != -1;
    //if it is store letter if not store letter in misses
    if(isHit){
        hits += letter;
    } else{
        misses += letter;
    }
    //return result hit or not
    return isHit;
}

public int getRemainingTries(){
    return MAX_MISSES - misses.length();
}
public String getCurrentProgress(){
    String progress = "";
    for (char letter : answer.toCharArray()){
        char display = '-';
        if(hits.indexOf(letter) != -1){
            display = letter;
        }
        progress += display;
    }
    return progress;
}

public boolean isWon(){
    return getCurrentProgress().indexOf('-') ==-1;
}

}


package hangMan;
import java.util.Scanner;

public class Prompter {
    private Game game;

    //constructor
    public Prompter(Game game){
        this.game = game;

    }

    public Prompter(String topic){

    }
    //prompt method to get input and send it to be tested
    public boolean promptForGuess(){
        boolean isHit = false;
        Scanner scanner = new Scanner(System.in);
        boolean isAcceptable = false;

        do{
        System.out.print("Enter a letter:  ");
        String guessInput = scanner.nextLine();

        try{
            isHit = game.applyGuess(guessInput);
            isAcceptable = true;
        }catch(IllegalArgumentException iae){
            System.out.printf("%s. Please Try again %n",iae.getMessage());
        }
        } while(! isAcceptable);
        return isHit;
    }

    public void displayOutcome(){
        if(game.isWon()){
            System.out.printf("Congrats you won with %d number of tries remaining!", game.getRemainingTries());
        }else{
            System.out.printf("Bummer the word was %s.  :(", game.getAnswer());
        }
    }

    public void displayProgess(){
        System.out.printf("You have %d remaining tries to guess: %s %n", game.getRemainingTries(), game.getCurrentProgress() );
    }

}

3 个答案:

答案 0 :(得分:0)

如果您不想要异常消息以及完整堆栈跟踪,那么您需要使用try/catch块捕获异常并使用异常变量来只打印出消息。特别是,您对给定例外的 getMessage() 方法感兴趣。

答案 1 :(得分:0)

以下是你将如何做到这一点

首先创建一个抛出Exception的方法,我创建了一个示例方法,在调用时简单地抛出Exception

public static void myFunc() throws Exception{
        throw new Exception("Custom error messgae");
}

现在在main方法中,我在try-catch块中添加了对此函数的调用,这样我就可以捕获异常

public static void main(String[] args) {

     try{
         myFunc();
     }catch(Exception ex){
         System.out.println(ex.getMessage());
     }
}

注意在try-catch块中,我调用getMessage()方法,该方法将显示从myFunc方法抛出的自定义错误消息。

修改

进一步说明

如果程序中存在throws异常而不是处理异常本身的方法,那么您需要一种机制来捕获该异常并以您自己的方式处理它。

使用try-catch块完成捕获和处理异常。在上面的例子中,因为有一个方法throws异常而不是处理它本身,任何调用这个特定方法的方法都应该负责处理这个方法抛出的异常。

正如您在上面的代码示例中所看到的,myFunc()方法是一种抛出异常的方法。既然这个方法本身并不处理异常,我们需要捕获此方法抛出的异常并以我们自己的方式处理它。

由于从main调用了myFunc()方法,我在myFunc()方法中使用try-catch块包围了对main的方法调用,因此我可以捕获并处理抛出的异常按myFunc()方法。

现在在catch方法的main块中,我可以以任何我想要的方式处理捕获的异常。如果我想显示自定义消息,我可以调用getMessage()方法。如果我想打印整个堆栈跟踪,我可以调用printStackTrace()方法。

答案 2 :(得分:0)

抛出异常与try catch不同。他们是相关的。但不同。

投掷例外基本上意味着:intentionally shows an exception (or error) within your code请参阅“例外”here的定义。

同时, try-catch 机制基本上意味着:defining what to do when an exception shows up in your code

请看下面的代码:

public static anImportantFunction(String word) {
    ...
    if(word.length()==0){
        throw new IllegalArgumentException("No letter found");
    }
    ...
}

该代码表示​​I want this program to fail/error when the word submitted are empty。为什么我们会故意在代码中出错?? 这样我们可以确保程序因错误的实现而失败。这与在控制台中编写消息不同,因为在控制台中写入实际上并不会停止我们的程序。