Java 使用多功能扫描仪的正确方法?
我有一个带有Java 使用多功能扫描仪的正确方法?,java,Java,我有一个带有main方法的控制台应用程序和一些从main调用的方法。在这里,我想向用户请求一些输入,为此我使用Scanner类 我的问题是: 我发现在从外部main读取输入时,如果没有随机异常或意外行为,就无法使用Scanner。我尝试了两种方法: 在包含main的类中有一个Scanner全局变量。然后 我在同一类中的所有函数中使用相同的扫描仪 在我需要请求输入的每个函数中,我声明了一个新的扫描仪 变量,使用它,然后在退出函数之前关闭它 一,。使扫描仪尝试读取两次。我的意思是,我在一个函数中有一
main
方法的控制台应用程序和一些从main
调用的方法。在这里,我想向用户请求一些输入,为此我使用Scanner
类
我的问题是:
我发现在从外部main
读取输入时,如果没有随机异常或意外行为,就无法使用Scanner
。我尝试了两种方法:
main
的类中有一个Scanner
全局变量。然后
我在同一类中的所有函数中使用相同的扫描仪
扫描仪
变量,使用它,然后在退出函数之前关闭它扫描仪
尝试读取两次。我的意思是,我在一个函数中有一个sc.readLine
,当我退出该函数时,我在main
中有另一个sc.readLine
。我输入一次,两个readLine
行被执行,第二行读取一个空字符串
二,。在程序执行期间,当我第二次调用任何sc.readLine
时抛出异常
(基类异常)
我还注意到,除了readLine
之外的任何其他方法都将读取同一行中的各种项目。例如,行“10203040”
将执行4个sc.nextInt
调用
TL;DR:如何在控制台应用程序中使用Scanner
?要使用Scanner的单个实例(或任何其他数据类型或类),可以使用设计模式“Singleton”,它包括为整个项目实例化对象的单个实例
单例定义(一个新类):
每次您想在任何地方使用扫描仪时,只需调用ScannerSingleton.getInstance()
,它将返回扫描仪的单个实例
使用示例:
String test = ScannerSingleton.getInstance().nextLine();
我建议将扫描仪
对象作为函数的另一个参数传递
public static void main(String[] args)
{
Scanner scanner=new Scanner(System.in);
String answer = ask(scanner, "what is your name?");
System.out.println("Oh! Hello dear " + answer + "!");
scanner.close();
}
private static String ask(Scanner scanner, String question)
{
System.out.println(question);
return scanner.nextLine();
}
单向:
import java.util.Scanner;
public class Main {
private Scanner scanner = new Scanner(System.in);
public Scanner getScanner() {
return scanner;
}
void fun1() {
Scanner in = getScanner();
System.out.print("Enter a string: ");
System.out.println("You entered: " + in.nextLine());
}
void fun2() {
Scanner in = getScanner();
System.out.print("Enter an integer: ");
int n = 0;
try {
n = Integer.parseInt(in.nextLine());
} catch (NumberFormatException e) {
e.printStackTrace();
}
System.out.println(n + " + 10 = " + (n + 10));
}
public static void main(String[] args) {
Main m = new Main();
m.fun1();
m.fun2();
}
}
Enter a string: Hello world!
You entered: Hello world!
Enter an integer: 25
25 + 10 = 35
import java.util.Scanner;
public class Main {
static void fun1(Scanner in) {
System.out.print("Enter a string: ");
System.out.println("You entered: " + in.nextLine());
}
static void fun2(Scanner in) {
System.out.print("Enter an integer: ");
int n = 0;
try {
n = Integer.parseInt(in.nextLine());
} catch (NumberFormatException e) {
e.printStackTrace();
}
System.out.println(n + " + 10 = " + (n + 10));
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
fun1(in);
fun2(in);
}
}
Enter a string: Hello world!
You entered: Hello world!
Enter an integer: 25
25 + 10 = 35
Enter some intgers: 10 5 20 15
[10, 5, 20, 15]
Enter some intgers: 4 40 a 20 b 15
[4, 40, -2147483648, 20, -2147483648, 15]
Note: invalid inputs have been reset to -2147483648
运行示例:
import java.util.Scanner;
public class Main {
private Scanner scanner = new Scanner(System.in);
public Scanner getScanner() {
return scanner;
}
void fun1() {
Scanner in = getScanner();
System.out.print("Enter a string: ");
System.out.println("You entered: " + in.nextLine());
}
void fun2() {
Scanner in = getScanner();
System.out.print("Enter an integer: ");
int n = 0;
try {
n = Integer.parseInt(in.nextLine());
} catch (NumberFormatException e) {
e.printStackTrace();
}
System.out.println(n + " + 10 = " + (n + 10));
}
public static void main(String[] args) {
Main m = new Main();
m.fun1();
m.fun2();
}
}
Enter a string: Hello world!
You entered: Hello world!
Enter an integer: 25
25 + 10 = 35
import java.util.Scanner;
public class Main {
static void fun1(Scanner in) {
System.out.print("Enter a string: ");
System.out.println("You entered: " + in.nextLine());
}
static void fun2(Scanner in) {
System.out.print("Enter an integer: ");
int n = 0;
try {
n = Integer.parseInt(in.nextLine());
} catch (NumberFormatException e) {
e.printStackTrace();
}
System.out.println(n + " + 10 = " + (n + 10));
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
fun1(in);
fun2(in);
}
}
Enter a string: Hello world!
You entered: Hello world!
Enter an integer: 25
25 + 10 = 35
Enter some intgers: 10 5 20 15
[10, 5, 20, 15]
Enter some intgers: 4 40 a 20 b 15
[4, 40, -2147483648, 20, -2147483648, 15]
Note: invalid inputs have been reset to -2147483648
另一种方式:
import java.util.Scanner;
public class Main {
private Scanner scanner = new Scanner(System.in);
public Scanner getScanner() {
return scanner;
}
void fun1() {
Scanner in = getScanner();
System.out.print("Enter a string: ");
System.out.println("You entered: " + in.nextLine());
}
void fun2() {
Scanner in = getScanner();
System.out.print("Enter an integer: ");
int n = 0;
try {
n = Integer.parseInt(in.nextLine());
} catch (NumberFormatException e) {
e.printStackTrace();
}
System.out.println(n + " + 10 = " + (n + 10));
}
public static void main(String[] args) {
Main m = new Main();
m.fun1();
m.fun2();
}
}
Enter a string: Hello world!
You entered: Hello world!
Enter an integer: 25
25 + 10 = 35
import java.util.Scanner;
public class Main {
static void fun1(Scanner in) {
System.out.print("Enter a string: ");
System.out.println("You entered: " + in.nextLine());
}
static void fun2(Scanner in) {
System.out.print("Enter an integer: ");
int n = 0;
try {
n = Integer.parseInt(in.nextLine());
} catch (NumberFormatException e) {
e.printStackTrace();
}
System.out.println(n + " + 10 = " + (n + 10));
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
fun1(in);
fun2(in);
}
}
Enter a string: Hello world!
You entered: Hello world!
Enter an integer: 25
25 + 10 = 35
Enter some intgers: 10 5 20 15
[10, 5, 20, 15]
Enter some intgers: 4 40 a 20 b 15
[4, 40, -2147483648, 20, -2147483648, 15]
Note: invalid inputs have been reset to -2147483648
运行示例:
import java.util.Scanner;
public class Main {
private Scanner scanner = new Scanner(System.in);
public Scanner getScanner() {
return scanner;
}
void fun1() {
Scanner in = getScanner();
System.out.print("Enter a string: ");
System.out.println("You entered: " + in.nextLine());
}
void fun2() {
Scanner in = getScanner();
System.out.print("Enter an integer: ");
int n = 0;
try {
n = Integer.parseInt(in.nextLine());
} catch (NumberFormatException e) {
e.printStackTrace();
}
System.out.println(n + " + 10 = " + (n + 10));
}
public static void main(String[] args) {
Main m = new Main();
m.fun1();
m.fun2();
}
}
Enter a string: Hello world!
You entered: Hello world!
Enter an integer: 25
25 + 10 = 35
import java.util.Scanner;
public class Main {
static void fun1(Scanner in) {
System.out.print("Enter a string: ");
System.out.println("You entered: " + in.nextLine());
}
static void fun2(Scanner in) {
System.out.print("Enter an integer: ");
int n = 0;
try {
n = Integer.parseInt(in.nextLine());
} catch (NumberFormatException e) {
e.printStackTrace();
}
System.out.println(n + " + 10 = " + (n + 10));
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
fun1(in);
fun2(in);
}
}
Enter a string: Hello world!
You entered: Hello world!
Enter an integer: 25
25 + 10 = 35
Enter some intgers: 10 5 20 15
[10, 5, 20, 15]
Enter some intgers: 4 40 a 20 b 15
[4, 40, -2147483648, 20, -2147483648, 15]
Note: invalid inputs have been reset to -2147483648
关于next()
或nextInt()
的问题:下面给出的方法是一次完成多个输入的推荐方法
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
boolean valid = true;
System.out.print("Enter some intgers: ");
String strNum = in.nextLine();
String[] strNumArr = strNum.split("\\s+");
int[] numArr = new int[strNumArr.length];
for (int i = 0; i < strNumArr.length; i++) {
try {
numArr[i] = Integer.parseInt(strNumArr[i]);
} catch (NumberFormatException e) {
numArr[i] = Integer.MIN_VALUE;
valid = false;
}
}
System.out.println(Arrays.toString(numArr));
if (!valid) {
System.out.println("Note: invalid inputs have been reset to " + Integer.MIN_VALUE);
}
}
}
另一个示例运行:
import java.util.Scanner;
public class Main {
private Scanner scanner = new Scanner(System.in);
public Scanner getScanner() {
return scanner;
}
void fun1() {
Scanner in = getScanner();
System.out.print("Enter a string: ");
System.out.println("You entered: " + in.nextLine());
}
void fun2() {
Scanner in = getScanner();
System.out.print("Enter an integer: ");
int n = 0;
try {
n = Integer.parseInt(in.nextLine());
} catch (NumberFormatException e) {
e.printStackTrace();
}
System.out.println(n + " + 10 = " + (n + 10));
}
public static void main(String[] args) {
Main m = new Main();
m.fun1();
m.fun2();
}
}
Enter a string: Hello world!
You entered: Hello world!
Enter an integer: 25
25 + 10 = 35
import java.util.Scanner;
public class Main {
static void fun1(Scanner in) {
System.out.print("Enter a string: ");
System.out.println("You entered: " + in.nextLine());
}
static void fun2(Scanner in) {
System.out.print("Enter an integer: ");
int n = 0;
try {
n = Integer.parseInt(in.nextLine());
} catch (NumberFormatException e) {
e.printStackTrace();
}
System.out.println(n + " + 10 = " + (n + 10));
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
fun1(in);
fun2(in);
}
}
Enter a string: Hello world!
You entered: Hello world!
Enter an integer: 25
25 + 10 = 35
Enter some intgers: 10 5 20 15
[10, 5, 20, 15]
Enter some intgers: 4 40 a 20 b 15
[4, 40, -2147483648, 20, -2147483648, 15]
Note: invalid inputs have been reset to -2147483648
使用Scanner
查看有关控制台输入的更多信息Java不支持全局变量的概念。基本上,您只是想了解如何通过控制台提供输入?使用方式2。如果您正确地使用它,并且有有效的输入可以读取,那么就不会有异常。我使用的是数字2,我得到的是NoTouchElementException。如果你愿意,我可以提供一些基本代码want@Konrad如果您关闭扫描仪
,Rudolph 2将无法工作,因为他特别提到要求用户输入,这意味着他正在使用系统.in
打开扫描仪
。如果关闭系统上的扫描仪
。在
中,您将无法再次打开系统。在
中,当您尝试创建和使用另一个扫描仪
时,代码将失败。如果使用系统,则不必关闭扫描仪
而忽略警告。在
中“我声明一个新的扫描仪变量,使用它,并在退出函数之前关闭它”关闭扫描仪还将关闭从中读取其数据的资源,因此如果您有类似void foo()的函数{Scanner sc=new Scanner(System.in)/*使用scanner*/sc.close()}
执行一些操作,然后在第一次调用foo
之后,它将关闭系统。在
中,这将阻止您再次读取它(就像您希望再次使用foo()
时)。而是创建一个扫描器并将其作为参数传递,如void foo(scanner sc){/*use scanner*/}
并将其与现有扫描器一起使用,如foo(scan)代码>。请注意,您的“单例”不是线程安全的,而且它在概念上感觉不确定(除了单例的一般问题):您不需要一个扫描程序。您需要一个标准的输入扫描仪。是的,这就是你的代码所做的,但是类名反映得很糟糕。它是如何不安全的?如果两个线程同时调用getInstance
,sc
可能会被初始化两次,因此你在系统上创建了两个ScannerSingleton
和两个Scanner
我理解,编辑完我的答案后,你就不会有这个问题了,从统计上看,它的风险很低,因为它只会在第一次调用Singleton时发生。一位微软工程师有句名言:“百万分之一”是下周二。”。这意味着,当代码频繁运行时,从统计上讲,即使发生的几率很小,也可以保证在长期内发生。永远不要相信低概率(除非你能准确地量化它们,比如GUID冲突,这种情况非常罕见,它们永远不会发生)。