【问题标题】:Have to Enter Input Twice for Scanner to Read it必须输入两次才能让扫描仪读取
【发布时间】:2013-03-31 00:09:32
【问题描述】:

所以在这段代码中,在方法“run”中的“Run”类下,扫描器似乎不想从第一次尝试中接收输入,只有在第二行才接收输入。我说第二行是因为我输入输入然后按两次回车,然后在第三行输入输入,它读取第二行,在这种情况下什么都没有。

我尝试过 BufferedReader 得到相同的结果,所以我相信我在做一些愚蠢的事情并且忽略了一些事情。

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;

import java.io.*;

class Global {
    public static int stop = -1;
}

public class DataSort {

    public static void main(String[] args){

        Timer timer = new Timer();
        Direct swit = new Direct();
        Run mprog = new Run();
        Help hlp = new Help();

        String newline = System.getProperty("line.separator");

        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        Scanner console = new Scanner(System.in);

        System.out.println(newline);
        System.out.println("Welcome to Data Sort! This Program is designed to sort information about targets discoverd by UAV and place the data in a table." + newline);
        System.out.print("For help, press any key. To continue, please wait. ");
        timer.schedule(swit, 3000);

        try {
            Global.stop = in.read();
        } 

        catch(IOException e) {
            e.printStackTrace();
        }

        try {
            in.close();
        }

        catch(IOException e) {
            e.printStackTrace();
        }
    }
}

class Direct extends TimerTask {

    public void run() {

        Run mprog = new Run();
        Help hlp = new Help();

        if(Global.stop != -1){
            System.out.println("Help");
            hlp.run();
        }

        if(Global.stop == -1) {
            System.out.println("Main");
            mprog.run();
        }
    }
}


class Help {

    public static void run() {
        String newline = System.getProperty("line.separator");

        System.out.print(newline);
        System.out.println("Entering Help Mode!" + newline);

        System.out.println("Entered Help Class");
        //String help = console.nextLine();
    }
}

class Run {

    public static void run() {

        /*EnterAll eall = new EnterAll();
        EnterCoords ecoords = new EnterCoords();
        EnterRelation erelat = new EnterRelation();
        EnterColor ecolor = new EnterColor();
        EnterShape eshape = new EnterShape();
        Coordinates coords = new Coordinates();
        Relation relat = new Relation();
        Color color = new Color();
        Shape shape = new Shape();
        List list = new List();
        Save save = new Save();
        SaveAs saveas = new SaveAs();*/

        String newline = System.getProperty("line.separator");
        Scanner console = new Scanner(System.in);

        System.out.print(newline);
        System.out.println("Initializing Main Program." + newline);
        System.out.println("************************** MAIN MENU *************************" + newline);
        System.out.println("Enter Coords \t Enter Relat \t Enter Color \t Enter Shape"+newline);
        System.out.println("Coordinates \t Relation \t Color \t \t Shape" + newline);
        System.out.println("Help \t \t List \t \t Save \t \t Save As" + newline);
        System.out.println("**************************************************************" + newline);

        System.out.print("Enter your selection or type All to enter lines consecutively: ");
        String raw = console.nextLine();

        System.out.println(raw);

        String select = errorCheck(raw);

        if (select.equals("All")){
        }

        if (select.equals("Enter Coords")){
        }

        if (select.equals("Enter Relat")){
        }

        if (select.equals("Enter Color")){
        }

        if (select.equals("Enter Shape")){
        }

        if (select.equals("Coordinates")){
        }

        if (select.equals("Relation")){
        }

        if (select.equals("Color")){
        }

        if (select.equals("Shape")){
        }

        if (select.equals("Help")){
        }

        if (select.equals("List")){
        }

        if (select.equals("Save")){
        }

        if (select.equals("Save As")){
        }
    }

    private static String errorCheck(String raw) {

        String select = raw;
        return select;
    }
}

【问题讨论】:

    标签: java string methods input


    【解决方案1】:

    你的问题出在

    public class DataSort {...... Global.stop = in.read(); ......} 
    

    因为 in.read 用于读取整数输入。它不读取行尾字符。这就是为什么在您输入选择字符串并按回车后变得毫无头绪的原因。

    问候, 拉维

    【讨论】:

    • +1。澄清一下,read() 读取单个字符,但将其作为整数返回。请参阅文档here
    • 哦,这并不是我遇到的麻烦,因为那只是检测任何键盘输入,然后告诉程序去哪个类。问题出在带有 String raw = console.nextLine(); 的 Run 类中
    • @Sean,在进入 raw = console.nextLine() 之前,它会执行 Global.stop = in.read()。这就是你得到控制台衣架的原因。
    • 啊,我现在明白了。原谅我对这个的基本了解,还在学习中!谢谢大家!
    • 好的,所以我现在使用扫描仪代替,但是正如你们所说,当我输入 NO 输入时,它仍在搜索一行输入。现在,有没有办法在 Direct 类中关闭扫描仪?我将如何解决这个问题,避免用 Global.stop 替换 raw (这会很草率)?
    【解决方案2】:

    @Sean,这是你的解决方案

    注释掉下面的行

    public class DataSort
    {
    .
    .
    .
    //BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    //Scanner console = new Scanner(System.in);
    .
    .
    .
    //Global.stop = in.read();
    .
    .
    }
    

    对于 Global.stop = in.read(),从同一个输入读取缓冲区读取(可能在同一个类或其他地方)并根据需要解析字符串。不要创建另一个输入读取缓冲区。

    问候, 拉维

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      • 2022-01-07
      • 1970-01-01
      相关资源
      最近更新 更多