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]
комментарии для достижения этого.