简体   繁体   中英

Infinite loop because of obj.hasNext()

I am trying to solve this problem. Following will be the input:

95.123 12
0.4321 20
5.1234 15
6.7592  9
98.999 10
1.0100 12

As I don't know how many lines of input will be given as input by poj.com I used following while loop.

Scanner obj = new Scanner(System.in);


        while(obj.hasNext()){
            double tmp1 = obj.nextDouble();
            int tmp2 = obj.nextInt();
            System.out.println(tmp1+" "+tmp2);

        }

Which reads data,the problem I have is control never breaks out of loop.

In case link for problem becomes unavailable following is statement of problem:

In case link for problem becomes unavailable, following is statement
of problem

Description  

Problems involving the computation of exact values of very large
magnitude and precision are common. For example, the computation of
the national debt is a taxing experience for many computer systems. 

This problem requires that you write a program to compute the exact
value of Rn where R is a real number ( 0.0 < R < 99.999 ) and n is an
integer such that 0 < n <= 25. 

Input  

The input will consist of a set of pairs of values for R and n. The R
value will occupy columns 1 through 6, and the n value will be in
columns 8 and 9. 

Output

The output will consist of one line for each line of input giving the
exact value of R^n. Leading zeros should be suppressed in the output.
Insignificant trailing zeros must not be printed. Don't print the
decimal point if the result is an integer. Sample Input

95.123 12
0.4321 20
5.1234 15
6.7592  9
98.999 10
1.0100 12 

Sample Output

548815620517731830194541.899025343415715973535967221869852721            .00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201

hasNext() is blocking operation. It means that until

  • stream is not closed
  • data representing end of stream was received,

it is possible that new data can arrive. This means that hasNext method can't return any answer until receives proper informations about state of stream on which it is listening which means it has to wait for any informations which blocks flow of control.

You should consider changing source of your data from System.in (which is not closed or doesn't send information about end of its data) to file which will contain informations about end of file.

So your code should look more like

Scanner sc = new Scanner(new File(pathToFile));
...

您可以输入CTRL-D来使System.in接收到EOF,这将结束循环。

You are probably checking if there is an input or not. Try doing the following. I was taking input for a String type array. If there is no input of type String, while loop keeps on running.

while(!obj.hasNext()){
    System.out.println("Invalid input");
    obj.next();
}
ar[i]=obj.next();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM