【问题标题】:Scanner.nextInt() strugglesScanner.nextInt() 挣扎
【发布时间】:2024-01-05 23:18:01
【问题描述】:

我制作了一个简单的基于文本的计算器,除了处理获取用户输入的方法之外,它都运行良好。即使我在 main 方法中创建了我的类的一个新实例,并使用该实例来调用输入法,我仍然得到编译器错误,即我从静态上下文中引用 nextInt()。请启发我。我的主要方法如下:

  public static void main (String[] args) {
    CalculatorTextVersion calculator = new CalculatorTextVersion();
    Scanner scanner = new Scanner(System.in);
    calculator.getCalculation();
  }

而getCalculation方法如下:

  public void getCalculation() {

    while (calculating = true) {

      System.out.print("First number: ");
      first = Scanner.nextInt();
      System.out.print("Second number: ");
      second = Scanner.nextInt();
      System.out.println("Choose an operation: | 1. Add | 2. Subtract | 3. Multiply | 4. Divide |:");
      opcode = Scanner.nextInt();
      calculate(first, second, opcode);
      getSymbol(opcode);
      System.out.println(first + opcode + second + " equals " + result + "." );
      System.out.print("Continue? Y/N:");
      yesNo = Scanner.next();

      if (yesNo == "Y" | yesNo == "Yes" | yesNo == "yes") {
        calculating = true;
      }

      if (yesNo == "N" | yesNo == "No" | yesNo == "no") {
        calculating = false;
      }
    }
  }

注意:所有变量、方法和导入都很好,我只是没有包括它们,因为它们不是问题的一部分。

编辑:使用经常建议的为扫描程序创建实例变量的技术通过了编译器,但在运行时产生了空指针错误。

编辑 2:问题解决了,我尝试了以唯一需要的方法创建新扫描仪的想法,效果很好。谢谢!

【问题讨论】:

  • 为什么你在你的班级之外创建了一个扫描仪实例,然后甚至没有将它作为参数传递给你的班级?
  • 你永远无法摆脱你的循环。两个原因。 (1) while (calculating = true) 实际上将 calculating 设置为 true。你需要==,而不是=。 (2) 当您在循环结束时检查yesNo 的值时,您需要使用equals,而不是==。你现在检查它的方式,没有什么是真的,因此calculating 永远不会改变。

标签: java methods static non-static


【解决方案1】:

这是最简单/最好的解决方案,所以我删除了其他解决方案。

public class YourClass
{
    public static void main(String[] args)
    {
        //Scanner scanner is now declared in your CalculatorTextVersion
        //CalculatorTextVersion() class in its constructor

        //Scanner scanner = new Scanner(System.in);

        CalculatorTextVersion calculator = new CalculatorTextVersion();
        calculator.getCalculation();
    }
}

import java.util.Scanner;

public static class CalculatorTextVersion
{
    Scanner scanner;

    public CalculatorTextVersion() {
        scanner = new Scanner(System.in);
    }
    public void getCalculation()
    {
        scanner.nextInt();
    }
}

【讨论】:

    【解决方案2】:

    我猜你需要搬家

    Scanner scanner = new Scanner(System.in);
    

    进入 CalculatorTextVersion 类。

    【讨论】:

      【解决方案3】:

      你需要这样做:

      public Scanner scanner = new Scanner(System.in);
      

      在 main 方法中。

      这会公开扫描仪以供在 getCalculation() 方法中使用。

      祝你好运!

      【讨论】:

      • 我不确定这是否是 java '合法',我的编译器告诉我这是在 main 方法中启动表达式的无效方式。
      • 在发布之前测试您的答案是避免投票失败的好方法。