【问题标题】:Can't close Scanner within method? Non-Static Method Close() [duplicate]无法在方法内关闭扫描仪?非静态方法 Close() [重复]
【发布时间】:2018-06-29 23:06:34
【问题描述】:

我认为这是一个非常简单的问题,但这是我在过去几个月中多次遇到的问题。我在一个方法中创建了一个扫描仪,然后尝试关闭它,它总是给我一个错误。这次的错误是:

错误:无法从静态上下文 Scanner.close() 引用非静态方法 close();

public static void readArray(char[] arr){
    String myMessage;
    System.out.print("Input Message: ");
    Scanner input = new Scanner(System.in);
    myMessage = input.nextLine();// Read a line of message

    for(int i = 0; i < myMessage.length(); i++){
        arr[i] = myMessage.charAt(i);
    }

    Scanner.close();
}

现在我读到这是因为我试图从静态方法中调用扫描仪类?所以扫描仪看不到扫描仪类?如果是这样,我将来应该如何正确处理这样的事情?我应该在创建它的方法中导入扫描仪类还是需要做其他事情?

谢谢

【问题讨论】:

  • 好吧,您不想关闭任何Scanner,而是要关闭名为input 的那个。因此它是input.close()
  • 正如 Izruo 所说。但是请注意,在整个程序中,只有一个 System.in 不是您自己打开的,并且一旦关闭就无法重新打开,因此您不应该在程序中间关闭它。这意味着,它的 Scanner 应该只构建一次,并且永远不会关闭。它应该建立在整个程序的最开始,可供程序的其余部分访问,并用于读取控制台输入。您不应该在 System.in 的辅助方法上创建扫描仪。
  • 我不认为这与您引用 @D.B. 的内容重复。这与Scanner 的东西更相关。
  • @LAD - 实际上,它是重复的,但是...... dup 树有点乱,因为有些人将“非静态方法无法引用......”标记为“非静态变量不能被引用..."
  • @Stephen C 好的,这是有道理的。

标签: java compiler-errors java.util.scanner


【解决方案1】:

应该是input.close(),而不是Scanner.close()

【讨论】:

  • 如果您确切了解静态对方法或字段的含义,这真的很有帮助。
  • 如果我弄错了请告诉我。静态意味着只有标记为静态的方法之外的变量才能“看到”,对吗?在 main 方法中创建的变量默认是静态的吗?当这些主要变量被静态方法调用时,它们正在使用该变量的一个实例,因此该实例被方法中的变量所遮蔽。我说对了吗?
  • 当一个变量是静态的时,意味着每个类只有一个变量的实例。静态变量属于类而不是类的实例。查看this link 获得最高票数的答案,详细了解静态字段和方法的工作原理。
  • 另外,this link 有更多关于静态方法和字段的信息。 @countercoded
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
  • 1970-01-01
相关资源
最近更新 更多