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冲突,这种情况非常罕见,它们永远不会发生)。