Java 虽然循环不会重新运行程序,但若要再次循环,请仅请求

Java 虽然循环不会重新运行程序,但若要再次循环,请仅请求,java,while-loop,Java,While Loop,我试图提示用户输入Y,Y或N,N,并使用while循环询问他们是否要重新运行程序。我试过使用从问题开始工作的代码。我更改了字符串choice=sc.next();进入下一步();当我运行程序时,一切正常,但当出现提示并回答y时,它只会询问我是否想再次运行而不实际运行程序(让用户输入和输出答案)。n将很好地工作并结束它。谢谢你抽出时间!这让我在这里、youtube和其他编码论坛上花了很多晚上寻找答案 编辑:我尝试将贷款相关代码移动到while循环(while和boolean之间),但现在它完全跳过

我试图提示用户输入Y,Y或N,N,并使用while循环询问他们是否要重新运行程序。我试过使用从问题开始工作的代码。我更改了字符串choice=sc.next();进入下一步();当我运行程序时,一切正常,但当出现提示并回答y时,它只会询问我是否想再次运行而不实际运行程序(让用户输入和输出答案)。n将很好地工作并结束它。谢谢你抽出时间!这让我在这里、youtube和其他编码论坛上花了很多晚上寻找答案

编辑:我尝试将贷款相关代码移动到while循环(while和boolean之间),但现在它完全跳过了“您想再次计算(y/n):”并直接进入“输入贷款金额:”而不询问

package numformexception;

import java.util.Scanner;

public class NumFormException {

public static void main(String[] args) {

    Scanner in = new Scanner(System.in);

    //Declare Variables
    double loanNum;
    double rateNum;
    double trateNum;
    double yearNum;
    double monthNum;
    double equNum;
    double outputNum;

    //Prompt for input
    System.out.print("Enter loan amount: ");
    loanNum = Double.parseDouble(in.nextLine());

    System.out.print("Enter rate: ");
    rateNum = Double.parseDouble(in.nextLine());

    System.out.print("Enter number years: ");
    yearNum = Double.parseDouble(in.nextLine());

    //Postive input data check
    if(loanNum <= 0 || rateNum <=0 || yearNum <=0)
    {
        System.out.println("You must enter positive numeric data! ");
        System.exit(0);
    }

    //Convert years to months 
    monthNum = yearNum * 12;

    //Convert rate to percent and monthly
    trateNum= (rateNum / 100) /12; 

    //Complete numerator 
    equNum = Math.pow((1+ trateNum), monthNum );

    //Plug equNum into formula
    outputNum = trateNum * loanNum * (equNum / (equNum - 1));


    System.out.printf("The monthly payment is: $ %.2f%n", outputNum);


    boolean isContinuing = true;

    while( isContinuing) {
        boolean inputIsInvalid = true;
        while (inputIsInvalid) {
            System.out.print("Would you like to calculate again (y/n): ");

            String choice = in.next();

            if("y".equalsIgnoreCase(choice)) {
                inputIsInvalid = false;

            }
            else if("n".equalsIgnoreCase(choice)){
                inputIsInvalid = false;
                isContinuing = false;
            }
            else {
                System.err.print("Error: Only valid answers are Y/N. ");
            }

        }
    }
}

}
包numformexception;
导入java.util.Scanner;
公共类NumFormException{
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(系统输入);
//声明变量
双贷款;
双速率;
双策略;
双重渴望;
双月;
双马;
双输出数;
//提示输入
系统输出打印(“输入贷款金额:”);
loanNum=Double.parseDouble(in.nextLine());
系统输出打印(“输入速率:”);
rateNum=Double.parseDouble(在.nextLine()中);
System.out.print(“输入年份:”);
deargenum=Double.parseDouble(in.nextLine());
//正向输入数据检查

如果(loanNum唯一将循环的代码是while循环中的代码。因此,没有任何与贷款相关的代码将循环是完全有意义的。如果要循环,必须首先将其放入循环中,很可能是在while继续while循环中,该循环应该将几乎所有内容都包含在主方法中,所有内容都包含在内在变量声明之后。

您的主计算将不会再次运行,因为它不是此循环的一部分:

while (isContinuing) {
    // ...
}
我建议将主要计算逻辑移到方法中,例如:

private static void calculateLoan(Scanner in) {
    //Declare Variables
    double loanNum;
    double rateNum;
    double trateNum;
    double yearNum;
    double monthNum;
    double equNum;
    double outputNum;

    //Prompt for input
    System.out.print("Enter loan amount: ");
    loanNum = Double.parseDouble(in.nextLine());

    System.out.print("Enter rate: ");
    rateNum = Double.parseDouble(in.nextLine());

    System.out.print("Enter number years: ");
    yearNum = Double.parseDouble(in.nextLine());

    //Postive input data check
    if (loanNum <= 0 || rateNum <= 0 || yearNum <= 0) {
        System.out.println("You must enter positive numeric data! ");
        System.exit(0);
    }

    //Convert years to months 
    monthNum = yearNum * 12;

    //Convert rate to percent and monthly
    trateNum = (rateNum / 100) / 12;

    //Complete numerator 
    equNum = Math.pow((1 + trateNum), monthNum);

    //Plug equNum into formula
    outputNum = trateNum * loanNum * (equNum / (equNum - 1));

    System.out.printf("The monthly payment is: $ %.2f%n", outputNum);
}

感谢您的回复!我尝试将贷款相关代码移动到while循环中,但现在它完全跳过了“您想再次计算(y/n):”并直接进入“输入贷款金额”:不询问用户。@javafarmer:那么你做错了——while continue循环需要包含所有内容,包括inputIsInvalid while循环。你的错误向我表明,你没有在头脑中思考程序的重要一步,看它的逻辑是如何流动的。请现在就开始这样做是解决这一问题和所有未来问题的宝贵工具。
public static void main(String[] args) {

    Scanner in = new Scanner(System.in);

    boolean isContinuing = true;

    while (isContinuing) {

        calculateLoan(in);

        boolean inputIsInvalid = true;
        while (inputIsInvalid) {
            System.out.print("Would you like to calculate again (y/n): ");

            String choice = in.next();

            if ("y".equalsIgnoreCase(choice)) {
                inputIsInvalid = false;

            } else if ("n".equalsIgnoreCase(choice)) {
                inputIsInvalid = false;
                isContinuing = false;
            } else {
                System.err.print("Error: Only valid answers are Y/N. ");
            }

        }
    }
}