Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-Scanner声明_Java_Loops_Java.util.scanner - Fatal编程技术网

Java-Scanner声明

Java-Scanner声明,java,loops,java.util.scanner,Java,Loops,Java.util.scanner,我是Java的新手。 下面是一个非常简单的切换方法 当用户在这里键入字符串时,它将抛出一个错误,catch将按照编码再次调用此方法 这是我关于扫描仪的问题 我意识到我需要把这些 Scanner sc=新扫描仪(System.in) 在“try”主体中,如果我想让它告诉我再次进行物理打字,那为什么呢?为什么打字 int-select=sc.nextInt() 这还不够吗 会 int select1=sc.nextInt()和 int select2=sc.nextInt()是否相同,因为它具有相同

我是Java的新手。 下面是一个非常简单的切换方法

当用户在这里键入字符串时,它将抛出一个错误,catch将按照编码再次调用此方法

这是我关于扫描仪的问题

我意识到我需要把这些

Scanner sc=新扫描仪(System.in)

在“try”主体中,如果我想让它告诉我再次进行物理打字,那为什么呢?为什么打字

int-select=sc.nextInt()

这还不够吗

int select1=sc.nextInt()

int select2=sc.nextInt()是否相同,因为它具有相同的“sc”实例

 public void reAsk(){
  System.out.println("Type a number")
  Scanner sc = new Scanner(System.in);

  try {
        int select = sc.nextInt();
        switch (select) {

        case 1:
            System.out.println("1");
            break;
        case 2:
            System.out.println("2");
            break;
        case 3:
            System.out.println("3");
            break;


    } catch (InputMismatchException e) {
        System.out.println("Please type int");
        reAsk();
    }
}

你的发现是错误的。我已经修复了您的代码,希望这能解决您的问题:

import java.util.InputMismatchException;
import java.util.Scanner;

public class Main {

    public static void reAsk() {
    System.out.println("Type a number");
    Scanner sc = new Scanner(System.in);

    try {
        int select = sc.nextInt();
        switch (select) {

        case 1:
            System.out.println("1");
            break;
        case 2:
            System.out.println("2");
            break;
        case 3:
            System.out.println("3");
            break;

        }
    } catch (InputMismatchException e) {
        reAsk();
    }
    }

    public static void main(String[] args) {
        reAsk();
    }

}

不需要在try catch中初始化scanner类。您只是有一些语法错误。首先,在Java中,每个语句必须以分号结尾,您忽略了在
System.out.println(“键入一个数字”)
之后添加分号

你的发现不正确。我已经修复了您的代码,希望这能解决您的问题:

import java.util.InputMismatchException;
import java.util.Scanner;

public class Main {

    public static void reAsk() {
    System.out.println("Type a number");
    Scanner sc = new Scanner(System.in);

    try {
        int select = sc.nextInt();
        switch (select) {

        case 1:
            System.out.println("1");
            break;
        case 2:
            System.out.println("2");
            break;
        case 3:
            System.out.println("3");
            break;

        }
    } catch (InputMismatchException e) {
        reAsk();
    }
    }

    public static void main(String[] args) {
        reAsk();
    }

}
不需要在try catch中初始化scanner类。您只是有一些语法错误。首先,在Java中,每个语句必须以分号结尾,您忽略了在
System.out.println(“键入一个数字”)
之后添加分号

调用
nextInt()
(或任何
next()
方法)只需尝试读取流中的下一个标记(在
nextInt()
的强制转换中),一个可能的符号(+/-)和数字,例如:标准输入

如果要键入:0 1 2,则对
nextInt()
的每个连续调用都将返回0、1和2

要继续使用
扫描器
,您不需要每次调用
reAsk
方法时都创建
扫描器
,也不需要在这种琐碎的情况下使用递归(除非是为了练习):您可以重用它,但在出现错误时必须小心缓冲区中留下的字符

例如:

Scanner sc = new Scanner(System.in);
try {    
  ...
  int select;
  for (;;) {
    try {
      select = sc.nextInt();
      break;
    } catch (InputMismatchException ignored) {
      continue;
    }
  }
  // select is always initialized in that case
  switch (select) {
    ...
  }
}
这将执行无限循环,因为
sc
无法读取
int
,并且缓冲区中仍然存在无效的
int
字符(例如:
'a1'

您可以使用
sc.next()
前进(这将丢弃下一个令牌,例如:上例中的
a

但在这种情况下,最好使用
sc.hasNextInt()

Scanner sc = new Scanner(System.in);
while (!sc.hasNextInt() && sc.hasNext()) {
  sc.next(); // advance / discard the invalid token
}

// we don't care about result of hasNext() here.
int select = sc.nextInt();
正如上面的评论所说,我们不测试
hasNext()
,主要原因有两个:

  • 如果
    hasNext()
    返回
    false
    ,则流更有可能结束。您可能希望在
    nextInt()
    之前调用
    hasNextInt()
    ,如果它返回
    false
    ,则正确结束您的方法。此示例将失败,并出现
    NoTouchElementException
  • System.in
    可能只有在它被重定向(例如:
    javamain
    echo a | javamain
    )或者调用了某个序列(我不记得了,但我相信它是Ctrl+Z)或者直接在java中关闭(in)(
    System.in.close()
注意:在大多数情况下,资源(如
扫描仪
)是在使用资源的尝试中创建的,例如:

虽然这是一种良好的做法,但这将关闭
系统。在
中,您将永远无法使用它:

try (Scanner sc = new Scanner(System.in)) {
  String next = sc.next(); // again, without hasNext().
}
try (Scanner sc = new Scanner(System.in)) {
  String next = sc.next(); // fail NoSuchElementException (stream is closed).
}
在您的情况下,您可以忽略try with resources。

调用
nextInt()
(或任何
next()
方法)只需尝试读取流中的下一个标记(在
nextInt()
的强制转换中,一个可能的符号(+/-)和数字),例如:标准输入

如果要键入:0 1 2,则对
nextInt()
的每个连续调用都将返回0、1和2

要继续使用
扫描器
,您不需要每次调用
reAsk
方法时都创建
扫描器
,也不需要在这种琐碎的情况下使用递归(除非是为了练习):您可以重用它,但在出现错误时必须小心缓冲区中留下的字符

例如:

Scanner sc = new Scanner(System.in);
try {    
  ...
  int select;
  for (;;) {
    try {
      select = sc.nextInt();
      break;
    } catch (InputMismatchException ignored) {
      continue;
    }
  }
  // select is always initialized in that case
  switch (select) {
    ...
  }
}
这将执行无限循环,因为
sc
无法读取
int
,并且缓冲区中仍然存在无效的
int
字符(例如:
'a1'

您可以使用
sc.next()
前进(这将丢弃下一个令牌,例如:上例中的
a

但在这种情况下,最好使用
sc.hasNextInt()

Scanner sc = new Scanner(System.in);
while (!sc.hasNextInt() && sc.hasNext()) {
  sc.next(); // advance / discard the invalid token
}

// we don't care about result of hasNext() here.
int select = sc.nextInt();
正如上面的评论所说,我们不测试
hasNext()
,主要原因有两个:

  • 如果
    hasNext()
    返回
    false
    ,则流更有可能结束。您可能希望在
    nextInt()
    之前调用
    hasNextInt()
    ,如果它返回
    false
    ,则正确结束您的方法。此示例将失败,并出现
    NoTouchElementException
  • System.in
    可能只有在它被重定向(例如:
    javamain
    echo a | javamain
    )或者调用了某个序列(我不记得了,但我相信它是Ctrl+Z)或者直接在java中关闭(in)(
    System.in.close()
注意:在大多数情况下,资源(如
扫描仪
)是在使用资源的尝试中创建的,例如:

虽然这是一种良好的做法,但这将关闭
系统。在
中,您将永远无法使用它:

try (Scanner sc = new Scanner(System.in)) {
  String next = sc.next(); // again, without hasNext().
}
try (Scanner sc = new Scanner(System.in)) {
  String next = sc.next(); // fail NoSuchElementException (stream is closed).
}

在您的情况下,您可以忽略资源试用。

1。您必须将它放在
try
块中,因为如果您输入的内容不是
int
,那么它将抛出一个错误。在
catch
块中,调用该方法,这样只要输入无效,它就可以继续调用该方法2。不,他们不一样了。
nextInt()
函数消耗部分