我一直在使用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() );
}
}
答案 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
。为什么我们会故意在代码中出错?? 这样我们可以确保程序因错误的实现而失败。这与在控制台中编写消息不同,因为在控制台中写入实际上并不会停止我们的程序。