【问题标题】:Wrong results after method invocation方法调用后的错误结果
【发布时间】:2018-07-02 07:51:55
【问题描述】:

所以我现在正在学习 Java 课程,任务是从 main 方法调用某些方法,并让它们执行,然后将它们的输出传递给 main 方法。一切正常,除了由于某种原因没有更新用户输入。我有两个单独的类要求用户输入,如果用户输入低于零,他们必须在继续之前重新输入零之前的数字。即使他们输入了多个数字,并且数字大于零,所以它返回值,它只返回他们曾经输入的第一个输入,而不是正确的输入。对这些人有什么见解吗?第一次在这里问问题,所以我真的不知道我是否破坏了任何格式或诸如此类的东西。任何帮助表示赞赏。

我发布的代码不是我的课程的实际代码,它只是我制作的用于演示问题的单独程序,可用于修复我的主要代码。它只是减少了很多无用的东西。

import java.util.Scanner;
public class tezsters {

    public static double test(double test1) {
        Scanner scanner=new Scanner(System.in);

        while(test1<=0) {
            System.out.println("Test one must be above zero, please reenter");
            test1 = Double.parseDouble(scanner.nextLine());
            System.out.println(test1);// this line is just here to test if the user input was being assigned to test1, which it was.
            if(test1>0) {
                return test1;
            }
        }
        return test1;
    }


    public static double tests(double test2) {
        Scanner scanner = new Scanner(System.in);
        while (test2 <= 0) {
            System.out.println("Test two must be above zero, please reenter");
            test2 = Double.parseDouble(scanner.nextLine());
            System.out.println(test2);
            if (test2 > 0) {
                return test2;
            }
        }
        return test2;
    }


    public static double display(double test1, double test2){
        System.out.println("if test 1 is " + test1);
        System.out.println("Then test 2 is " + test2);
        return test1;
    }


    public static void main (String [] args) {

        Scanner scanner=new Scanner(System.in);
        System.out.println("Enter test 1 value");
        double test1 = Double.parseDouble(scanner.nextLine());
        test(test1);
        System.out.println("Enter test 2 value");
        double test2 = Double.parseDouble(scanner.nextLine());
        tests(test2);
        display(test1,test2);

    }
}

【问题讨论】:

  • 尚未通读全文,但您可能不想为 System.in 分配多个扫描程序。分配一次,然后设置为静态/实例字段或通过方法参数传入。

标签: java user-input


【解决方案1】:

在您的主要方法中,您执行以下操作:

double test1 = Double.parseDouble(scanner.nextLine());
test(test1);
System.out.println("Enter test 2 value");
double test2 = Double.parseDouble(scanner.nextLine());
tests(test2);
display(test1,test2);

所以基本上你创建了两个双打然后传入testtests 方法。然后在这些方法的上下文中检查这些数字,如果发现是否定的,则提示用户重新输入一个数字。

问题是,最后,当您调用 display 方法时,您实际上从未传入由 testtests 返回的值,而是传入原始的 test1test2,因此为什么最终输出将仅显示用户的原始数字输入。由于这两种方法都返回一个双精度值,因此您可以将它们的返回值存储到一个变量中并将其传递给display

从这个意义上说,您的代码应该如下所示:

Scanner scanner=new Scanner(System.in);
System.out.println("Enter test 1 value");
// initial value is created and passed in to test method here
double test1 = Double.parseDouble(scanner.nextLine());
// here we grab the return value of the test method
double value1 = test(test1);
System.out.println("Enter test 2 value");
// initial value is created and passed in to tests method here
double test2 = Double.parseDouble(scanner.nextLine());
// here we grab the return value of the tests method.
double value2 = tests(test2);
// pass in the value returned from both methods (ensuring we have the latest user input) to display
display(value1, value2);

【讨论】:

  • 我觉得这句话有点令人困惑——“由于这两种方法都返回一个双精度值,你可以将它们的返回值存储到一个变量中并将它们传递给显示”。只要返回类型为非 void,您就可以存储返回值,而不仅仅是当返回值为双精度值时。也许您的意思是该值可以存储在现有变量中?
  • 我认为这一点也不令人困惑。由于他的方法返回双精度,他可以将它们的返回值存储在一些变量中并将它们传递给显示。你有什么困惑?
  • 您能否详细说明需要进行的更改?我做了我认为你想让我做的改变,我仍然有同样的问题,它只返回初始值,即使 test1 和 test2 的值仍在各自的方法中更新。
  • 老实说,我没有完全理解您的第一个响应是什么意思,所以我所做的是在 if 语句下的“测试”方法中,我创建了一个名为 fin1 的新双精度,它等于结果test1,并将其返回给 main 方法。方法测试和测试 2 也是如此。在主要方法中,我只是调用它来显示 fin1 和 fin2 而不是 test1 和 test2。
  • 我刚刚发布了您需要进行的更改的示例。请继续检查。
猜你喜欢
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 2018-08-19
相关资源
最近更新 更多