Java Scanner Within Another Method -


i working on lab 1 of classes therefore looking more explanation actual code.

for part of assignment need read in numbers user until control-d pressed. have while loop in method , passing scanner method well, here main method:

    scanner scan = new scanner(system.in);      system.out.println("length:");     int length = 0;      if(scan.hasnextint()){         length = scan.nextint();     }      if(length<0 || length>100){         system.out.println("length not of proper size");         scan.close();         return;     }      double[] a1 = new double[length];     double[] a2 = new double[length];     fillwithzeros(a1);     fillwithzeros(a2);      system.out.println("enter numbers multiplied:");      a1 = fillwithvalues(a1,scan);     a2 = fillwithvalues(a2,scan);     double total = calculatetotal(a1,a2);     printvector(a1,"a1");     printvector(a2,"a2");     system.out.println("total: " + total);     scan.close(); 

then here fillwithvalues method:

public static double[] fillwithvalues(double[] array, scanner scan) {     int numberofelements = 0;     while(scan.hasnextdouble()){         if(numberofelements<array.length){             array[numberofelements] = scan.nextdouble();             numberofelements++;         }else{             return array;         }     }     return array; } 

the issue having when press control-d doesn't end input stream should, have code above in main end input stream, explain why having issue?

i declare scanner global variable not allowed use global variables assignment.

in code above, using

a1 = fillwithvalues(a1,scan); a2 = fillwithvalues(a2,scan); 

where fillwithvalues() does

while(scan.hasnextdouble()){    ... } 

that means, if scanner observes eof character (ctrl-d in case of unix), scan.hasnextdouble() return false , method terminate - however, program calls method again scanner wait next double (if press ctrl-d again program should terminate in case also).

if replace two method calls one invocation of loop, programm resume after (first only) loop , terminate.

to solve that, can let method return boolean instead of array (you not need return , re-assign array return value since modifying array elements of array passing parameter):

public static boolean fillwithvalues(double[] array, scanner scan) {     int numberofelements = 0;     while(scan.hasnextdouble()){         if(numberofelements<array.length){             array[numberofelements] = scan.nextdouble();             numberofelements++;         }else{             return true;  // elements read         }     }     return false;   // input aborted } 

the calling code can decide whether terminate or continue:

if (fillwithvalues(a1,scan) == true) {     fillwithvalues(a2,scan);  // check return value again if required } 

btw, use static methods when absolutely required - there no need here. should take excercise remove static method, once overall logic works fine.


Comments