Java: почему этот код не работает? Бесконечный цикл?

Таким образом, как вы можете понять из моей попытки, я пытаюсь выяснить, как я создал бы программу, которая дает пользователю 5 секунд для ввода некоторых строк текста, а затем сканер подсчитает, сколько строк было введено. Я только начал изучать Java как второй язык, поэтому, пожалуйста, постарайтесь объяснить все как можно проще:)

У меня есть две теории относительно того, почему это не работает. Во-первых, nextLine() вернет всю строку, независимо от того, пустая она или нет, а не NL, равная "", фактически она будет равна всей строке (т. Е. " "). И моя вторая теория заключается в том, что я понятия не имею, что я делаю, и поток программ повсюду. Во всяком случае, вот мой код:

class OrigClass{
    public static void main(String args[]){
        Scanner ScanObj = new Scanner(System.in);
        int Count = 0;
        String NL = ScanObj.nextLine();
        try{
            Thread.sleep(5000);}
        catch (InterruptedException e){
            e.printStackTrace();
        }
        while (!NL.equals("")){
            Count++;
            NL = ScanObj.nextLine();
        }
        System.out.print("You Entered " + Count + " Lines.");
        ScanObj.close();
    }
}

О, я забыл упомянуть, что hasNext() был тем, что я изначально пробовал:

       import java.util.Scanner;

    class OrigClass{
public static void main(String args[]){
    Scanner ScanObj = new Scanner(System.in);
    int Count = 0;
    try{
    Thread.sleep(5000);}
    catch (InterruptedException e){
        e.printStackTrace();
    }
    while (ScanObj.hasNext() == true){
    Count++;
    ScanObj.nextLine();
    }
    System.out.print("You Entered " + Count + " Lines.");
    ScanObj.close();
}
    }

2 ответа

Судя по всему, этот код должен работать. Единственное, что я предполагаю, это то, что вы вводите данные вручную и забыли сообщить об окончании ввода с помощью CTRL+D, Однако, сделав это, вы получите NoSuchElementException если вы не используете ScanObj.hasNext(),

Вы также можете запустить свой код, используя перенаправление ввода. java OrigClass < data

Лучший способ сделать это будет следующим:

import java.util.Scanner;

public class Sc {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int count = 0;
        String nl; // = scan.nextLine();
        //while (!NL.equals(""))
        while(scan.hasNext())
        {
          count++;
          nl = scan.nextLine();
        }
        System.out.println("Done!  Count: " + count);
        scan.close();
    }
}

Разница в том, что мы сохраняем первый nextLine() пока мы не в цикле. Это даст точное количество строк на входе.

Только не забудьте сигнализировать конец ввода с помощью CTRL+D,

Ну, это решение не очень хорошо. но работает.

public class FiveSecond {
  public static void main(String args[]){
    new Thread(new Count(new Reader())).start();
  }
}
class Count implements Runnable{
  Reader r;Thread t;
  Robot ro;
  public Count(Reader t){this.r=t;
  try {
    ro=new Robot();
  } catch (AWTException e) {e.printStackTrace();}
  }
  @Override
  public void run() {
    t=new Thread(r);
    //t.setDaemon(true); //[S2]
    t.start();
    try{
    Thread.sleep(5000);
    }catch(Exception e){}
    t.interrupt();
    //Implicitly press the enter key in order to release the readLine() method :D
    //not recommended, and it's not a good idea, but works
    ro.keyPress(KeyEvent.VK_ENTER);
    ro.keyRelease(KeyEvent.VK_ENTER);
    /*
     * this is possible to save the strings lines in somewhere in order to access from invoker application
     * or send back the strings by socket, etc . . .
     */
    System.out.println("number of entered lines "+r.getCount()+"\n");
    //you would run this main as a process and get the number of counts 
    //System.exit(r.getCount()); //[S2]
  }
}

class Reader implements Runnable{
  private List<String> lines;
  private volatile int count;
  private BufferedReader br;
  public Reader(){
    lines=new ArrayList<String>();
    br=new BufferedReader(new InputStreamReader(System.in));
  }
  @Override
  public void run() {
    try{String line;
      System.out.println("you have 5 second to detect a 2048 length character, then your system will broken");
      while((line=br.readLine())!=null){
        if(!Thread.currentThread().isInterrupted()){
      count++;lines.add(line);}else{break;}
      }
      //for showing the lines entered
      //System.out.println(lines.toString());
    }catch(Exception ex){}
  }
  public int getCount(){return this.count;}  
}

но лучший подход заключается в запуске отдельного процесса для подсчета строк, и вы просто удалите [S2] комментарии для достижения этого.

Другие вопросы по тегам