改善我的猜谜游戏

时间:2017-03-25 05:14:13

标签: java

我目前正在制作猜测游戏,我让它上班(我真的很感激,如果有人测试它并评论他们认为我将链接我的GitHub回购在帖子的底部)但我还有一点问题,当用户输入非法猜测(高于jar中的最大项目数或低于1)时会抛出IllegalArgumentException(就像我设计的那样),但程序停止提示用户猜测,我无法弄清楚如何让它继续提示。如果有人可以帮助我,我会非常感激。关于该项目的另一个问题是,"将I / O封装在一个提示器类中是什么意思" ?我做了一个提示者,但我不确定实施是否真的很好,如果有人有任何想法我一般可以改进这个程序,我真的很想听到它们。

这是该计划:https://github.com/Melodie95/Treehouse-Project-1-

提前致谢:)

1 个答案:

答案 0 :(得分:0)

这里可以完成两件事之一,或者用其他东西代替抛出异常,这将是这样的:

在Game.main()里面改变了这个:

try{
    jar.guess();

} catch(IllegalArgumentException iae){
    System.out.println("Please choose a valid number");
}

到此:

jar.guess();

简单地删除try catch检查并在Jar.guess()内部更改:

if(guess>maxNumberOfItems){
    throw new IllegalArgumentException();
} else if (guess<1){
    throw new IllegalArgumentException();
}

到此:

// ||表示逻辑OR,如果2个条件中的任何一个为真,则if将在本例中读为true

if(guess>maxNumberOfItems || guess<1){
    System.out.println("Please choose a valid number");
}

但是,如果你使用例外来学习例外而不是你遇到问题的原因是因为有两件事 首先关闭 - 当在guess()中发生异常但是没有捕获到java的异常系统检查以查看guess()是否期望抛出异常,在你的情况下它不会,这意味着异常永远不会离开guess()和异常错误输出,你的try catch永远不会看到异常。 你告诉方法传递某种类型的任何异常的方法是把关键字抛出,然后是它应该在()和方法头的开头{之间传递的异常类型,如下所示:

public void guess() throws IllegalArgumentException {

但这只允许你当前的try catch查看异常并阻止程序错误输出

为了让它继续提示猜测,在这种情况下,try catch必须在while循环内,导致首先重复猜测。要做到这一点,你可以把try catch放在guess()

while(guess != numberOfItems){
    try{
        if(guess>maxNumberOfItems){
            throw new IllegalArgumentException();
        } else if (guess<1){
            throw new IllegalArgumentException();
        }
    } catch(IllegalArgumentException iae){
        System.out.println("Please choose a valid number");
    }

    prompter.tryAgain();
    guess = scanner.nextInt();
    numberOfGuesses++;
}

或者您可以将thrle IllegalArgumentException子句添加到guess()并将guess循环(以及一些存储猜测数量的变量)移到guess()之外,以便为每个猜测调用一次guess()每场比赛一次

有关throws子句的更多信息,请查看oracle的java文档here