2015-12-29 10 views
5

mi stava facendo un programma per ridurre dato interi alla loro più semplice ratio.But un errore si verifica durante l'assunzione di ingressi attraverso classe Scanner in una sotto-modalità di program.Here è il codice:di ingresso utilizzando la classe scanner in java

package CodeMania; 

import java.util.Scanner; 

public class Question5 
{ 
public static void main(String args[]) 
{ 
    Scanner sc=new Scanner(System.in); 
    int T=sc.nextInt();// number of test cases 
    sc.close(); 
    if(T<1) 
    { 
     System.out.println("Out of range"); 
     System.exit(0); 
    } 
    for(int i=0;i<T;i++) 
    { 
    ratio();//line 19 
    } 

} 
static void ratio() 
{ 
    Scanner sc1=new Scanner(System.in); 
    int N=sc1.nextInt();//line 26 
    if((N>500)||(N<1)) 
    { 
     System.out.println("Out of range"); 
     System.exit(0); 
    } 
    int a[]=new int[N]; 
    for(int i=0;i<N;i++) 
    { 
     a[i]=sc1.nextInt(); 
    } 
    int result = a[0]; 
    for(int i = 1; i < a.length; i++) 
     { 
    result = gcd(result, a[i]); 
    } 
    for(int i=0;i<N;i++) 
    { 
     System.out.print((a[i]/result)+" "); 
    } 
    sc1.close(); 
} 
static int gcd(int a, int b) 
{ 
    while (b > 0) 
    { 
     int temp = b; 
     b = a % b; 
     a = temp; 
    } 
    return a; 
} 
} 

L'errore è--

Exception in thread "main" java.util.NoSuchElementException 
    at java.util.Scanner.throwFor(Scanner.java:862) 
    at java.util.Scanner.next(Scanner.java:1485) 
    at java.util.Scanner.nextInt(Scanner.java:2117) 
    at java.util.Scanner.nextInt(Scanner.java:2076) 
    at CodeMania.Question5.ratio(Question5.java:26) 
    at CodeMania.Question5.main(Question5.java:19) 

Qui ho usato 2 scanner separato oggetti mb in funzione principale e SC1 in funzione di rapporto di prendere input da console. Tuttavia, se sto dichiarando un oggetto Scanner statico di tipo pubblico in ambito di classe e quindi utilizzando un solo oggetto Scanner in tutto il programma per prendere input, il programma funziona come richiesto senza errori.

Perché questo sta accadendo ...?

+0

Vedi [questa risposta] (http://stackoverflow.com/questions/4232588/how-to-use-multiple-scanner-objects-on-system-in), penso che tu abbia il stesso problema. –

risposta

5

Il motivo di questo errore è che la chiamata .close() sullo scanner chiude anche il sistema di inputStream , ma l'istanziazione di un nuovo scanner non la riapre.

È necessario passare un singolo scanner nei parametri del metodo o trasformarlo in una variabile globale statica.

+0

Sapevo che avrei dovuto passare un singolo scanner per l'intero programma. Ma non sapevo perché non posso usare più scanner .... Grazie per il motivo. –

0

Dal momento che il main() e il metodo di ratio() utilizzano Scanner gettano eccezioni, quando si verifica un'eccezione il normale flusso del programma viene interrotto e il programma/applicazione termina in modo anomalo, che non è raccomandato, quindi, queste eccezioni devono essere gestiti . Si può verificare un'eccezione per molti motivi diversi, di seguito sono riportati alcuni scenari in cui si verifica un'eccezione.

A user has entered invalid data. 

A file that needs to be opened cannot be found. 

A network connection has been lost in the middle of communications or the JVM has run out of memory. 

è possibile gestire queste eccezioni utilizzando try/catch blocchi, oppure è in grado di gestire utilizzando la parola tiri dopo la definizione del metodo, nel tuo caso questi due approcci stanno per essere come questo:

Con try/catch:

public static void main() 
    { 
    try{ 
     Scanner sc=new Scanner(System.in); 
     int T=sc.nextInt();// number of test cases 
     sc.close(); 
     } 
    catch(NoSuchElementException e){ 
    System.out.print("Exception handled" + e); 
    //rest of method 
    } 
    static void ratio(){ 
    try{ 
    Scanner sc1=new Scanner(System.in); 
    int N=sc1.nextInt();} 
    catch(NoSuchElementException e){ 
    System.out.print("Exception handled" + e);} 
    //rest of method 
    } 

Con "getta":

public static void main()throws Exception{ 

     //rest of method 
    } 
    static void ratio()throws Exception 
    { 
    //rest of method 
    } 
0

provare questo. È possibile passare lo scanner come argomento

package stack.examples; 

import java.util.Scanner; 

public class Question5 { 
public static void main(String args[]) { 
    Scanner sc = new Scanner(System.in); 
    int T = sc.nextInt();// number of test cases 
    if (T < 1) { 
     System.out.println("Out of range"); 
     System.exit(0); 
    } 
    for (int i = 0; i < T; i++) { 
     ratio(sc);// line 19 
    } 
    sc.close(); 
} 

static void ratio(Scanner sc1) { 
    int N = sc1.nextInt();// line 26 
    //Your Logic 
} 

static int gcd(int a, int b) { 
    while (b > 0) { 
     int temp = b; 
     b = a % b; 
     a = temp; 
    } 
    return a; 
} 

}

0
import java.util.*; 
public class Understanding_Scanner 
{ 
public static void main() 
{ 
Scanner sc= new Scanner(System.in); 
System.out.println("Please enter your name"); 
String name=sc.next(); 
System.out.println("Your name is:"+name); 
} 
} 

Ora per spiegare questa cosa così dobbiamo importare una classe scanner dal pacchetto di utilità Java per cui questo può essere ottenuto il codice a prima riga la seconda riga sta creando una classe NOTA (IL NOME DELLA CLASSE NON AVREBBE INIZIO CON CAPITALE) ora viene visualizzato l'argomento principale Classe scanner, per cui dobbiamo creare una classe scanner all'interno del programma con il codice che è stato dato nella quarta linea ... in questa affermazione 'sc' è un oggetto che st rispetta i valori della classe scanner, quindi se vuoi fare qualsiasi operazione nella classe scanner puoi farlo tramite l'oggetto "sc" * NOTA (puoi nominare un oggetto come qualsiasi cosa: poop, bla, ecc.) ... allora abbiamo questo comando interessante che dice System.ora consente agli utenti di scrivere qualsiasi istruzione tramite la tastiera o qualsiasi dispositivo di input durante il tempo di esecuzione .... String name = sc.next() questa riga ci aiuta a scrivere qualsiasi stringa che vogliamo scrivere durante il tempo di esecuzione , che sarà memorizzato nella variabile nome

Quindi è tutto, questa è la classe dello scanner per voi. Spero sia facile da capire.

evviva !! Continua a scrivere :-)

Problemi correlati