Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Polestar 3 Performance, test drive: comodità e potenza possono convivere
Polestar 3 Performance, test drive: comodità e potenza possono convivere
Abbiamo passato diversi giorni alla guida di Polestar 3, usata in tutti i contesti. Come auto di tutti i giorni è comodissima, ma se si libera tutta la potenza è stupefacente
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 25-03-2011, 15:42   #1
[Kendall]
Senior Member
 
L'Avatar di [Kendall]
 
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
[Java] Problema in esecuzione del metodo nextLine

Salve ragazzi, volevo chiedervi un consulto... Mi sto impratichendo di Java e facevo qualche esercizietto proposto... In pratica è un semplice programma di inserimento di una tabella caratteri e ricerca all'interno della stessa... Tutto ok, tranne un particolare.

Quando inserisco nella tabella i caratteri, nonchè poi quando vado ad inserire il carattere da ricercare, mi permette di utilizzare il metodo:

tabella[i][j] = input.next().charAt(0);

e non il metodo

tabella[i][j] = input.nextLine().charAt(0);

In questo secondo caso mi dà il classico errore in fase di esecuzione OutOfBound per la Stringa inserita.
Io però ricordo assolutamente di aver già utilizzato in un altro programmino la versione con nextLine, senza errore alcuno...
Conosco le differenze tra il next, e il nextLine (la prima prende la prima parola, la seconda l'intera riga, spazi inclusi, se non erro), ma non capisco in questo caso perchè dia un simile errore.
Ecco il codice del programma comunque.

Codice:
import java.util.Scanner;

class Esercizio15 {
  public static void main(String argv[]) {
    char tabella[][];
    char ricerca;
    int r, c;
    int i, j;
    int contatore;
    Scanner input = new Scanner(System.in);
    
    System.out.println();
    
    System.out.println("Inserire le dimensioni della tabella da compilare:");
    do {
      System.out.print("Righe = ");
      r = input.nextInt();
      if (r<2) {
        System.out.println("Una tabella deve contenere almeno due righe e due colonne. Riprovare...");
      }
    } while (r<2);
    do {
      System.out.print("Colonne = ");
      c = input.nextInt();
      if (c<2) {
        System.out.println("Una tabella deve contenere almeno due righe e due colonne. Riprovare...");
      }
    } while (c<2);
    
    tabella = new char[r][c];
    
    System.out.println();
    
    System.out.println("Inserire i caratteri nella tabella, seguendo l'ordine indicato a schermo:\n");
    for (i=0 ; i<r ; i++) {
      for (j=0 ; j<c ; j++) {
        System.out.print("Tabella(" + (i+1) + "," + (j+1) + ") = ");
        tabella[i][j] = input.next().charAt(0);
      }
      System.out.println();
    }
    
    System.out.println("\n");
    
    System.out.println("TABELLA CARATTERI");
    for (i=0 ; i<r ; i++) {
      System.out.print("|");
      for (j=0 ; j<c ; j++) {
        System.out.print(" " + tabella[i][j] + " ");
      }
      System.out.print("|");
      System.out.println();
    }
    
    System.out.println();
    
    System.out.print("Inserire il carattere da ricercare: ");
    ricerca = input.next().charAt(0);
    contatore = 0;
    for (i=0 ; i<r ; i++) {
      for (j=0 ; j<c ; j++) {
        if (tabella[i][j] == ricerca) {
          System.out.println("Trovato! Riga " + (i+1) + ", Colonna " + (j+1) + ".");
          contatore += 1;
        }
      }
    }
    if (contatore == 0) {
      System.out.println("Carattere non trovato!");
    }
    
    System.out.println();     
  }
}
Qualche idea?
[Kendall] è offline   Rispondi citando il messaggio o parte di esso
Old 25-03-2011, 15:55   #2
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Puoi postare lo stack trace dell'eccezione?
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 25-03-2011, 16:01   #3
[Kendall]
Senior Member
 
L'Avatar di [Kendall]
 
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Puoi postare lo stack trace dell'eccezione?
Codice:
Inserire le dimensioni della tabella da compilare:
Righe = 4
Colonne = 6

Inserire i caratteri nella tabella, seguendo l'ordine indicato a schermo:

Tabella(1,1) = Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
	at java.lang.String.charAt(String.java:694)
	at Esercizio15.main(Esercizio15.java:51)
Però non capisco. La posizione 0 di una stringa dovrebbe essere sempre e comunque il primo carattere che la compone (come un array di qualsiasi altro tipo). Ed infatti con next().charAt(0) funziona...

Mumble mumble...
[Kendall] è offline   Rispondi citando il messaggio o parte di esso
Old 25-03-2011, 16:08   #4
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Stai usando uno Scanner collegato allo stream di standard input (System.in)

Scanner funziona in base ad un delimiter, che è un pattern rispetto al quale esegue dei match per isolare le parti di input considerate come token validi.

Siccome non setti esplicitamente il delimiter, viene usato quello di default che matcha tutti i whitespace (in sostanza "spazi vuoti" e i caratteri di "fine linea").

Usare next() o nextLine() non è esattamente la stessa cosa.
next() è token-centrica, ed è così documentata:
Quote:
public String next()

Finds and returns the next complete token from this scanner. A complete token is preceded and followed by input that matches the delimiter pattern. This method may block while waiting for input to scan, even if a previous invocation of hasNext() returned true.
Qui hai la garanzia che la String restituita è un token valido, per come sono definiti i token in base al delimiter impostato. Nel tuo caso un token valido è una qualsiasi stringa preceduta e seguita da whitespace, il che implica che una stringa vuota non da luogo a match e dunque non verrà restituita da next().

nextLine() invece non è token-centrica ma line-centrica, per così dire. E' documentata così:
Quote:
public String nextLine()

Advances this scanner past the current line and returns the input that was skipped. This method returns the rest of the current line, excluding any line separator at the end. The position is set to the beginning of the next line.

Since this method continues to search through the input looking for a line separator, it may buffer all of the input searching for the line to skip if no line separators are present.
nextLine() restituisce dunque una stringa, ma non è detto che quella stringa debba essere per forza un token definito dalle regole di match relative al delimiter scelto (come invece era per next). Ergo nextLine() può restituire una linea vuota, ed è (credo) il tuo caso: alla prima lettura di System.in, in System.in stesso c'è solo il carattere di fine-linea, nextLine skippa oltre e restituisce tutto quello che ha incontrato prima del fine-linea stesso, ovvero una bella String vuota (String vuota = "").

Tu provi ad accedere all'indice 0 del sottostante array di char contenuto dalla String e boom, ti bechi lo StringIndexOutOfBounds
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 25-03-2011 alle 16:24.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 25-03-2011, 17:18   #5
[Kendall]
Senior Member
 
L'Avatar di [Kendall]
 
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Stai usando uno Scanner collegato allo stream di standard input (System.in)

Scanner funziona in base ad un delimiter, che è un pattern rispetto al quale esegue dei match per isolare le parti di input considerate come token validi.

Siccome non setti esplicitamente il delimiter, viene usato quello di default che matcha tutti i whitespace (in sostanza "spazi vuoti" e i caratteri di "fine linea").

Usare next() o nextLine() non è esattamente la stessa cosa.
next() è token-centrica, ed è così documentata:

Qui hai la garanzia che la String restituita è un token valido, per come sono definiti i token in base al delimiter impostato. Nel tuo caso un token valido è una qualsiasi stringa preceduta e seguita da whitespace, il che implica che una stringa vuota non da luogo a match e dunque non verrà restituita da next().

nextLine() invece non è token-centrica ma line-centrica, per così dire. E' documentata così:

nextLine() restituisce dunque una stringa, ma non è detto che quella stringa debba essere per forza un token definito dalle regole di match relative al delimiter scelto (come invece era per next). Ergo nextLine() può restituire una linea vuota, ed è (credo) il tuo caso: alla prima lettura di System.in, in System.in stesso c'è solo il carattere di fine-linea, nextLine skippa oltre e restituisce tutto quello che ha incontrato prima del fine-linea stesso, ovvero una bella String vuota (String vuota = "").

Tu provi ad accedere all'indice 0 del sottostante array di char contenuto dalla String e boom, ti bechi lo StringIndexOutOfBounds
Grazie mille per la spiegazione... Purtroppo devo ancora arrivare nella sezione che tratta in maniera approfondita questi argomenti e non è la prima volta infatti che il .nextLine mi dà problemi.
Quindi, se io volessi leggere l'intera riga, nel mio caso preciso (non so, magari per aver la possibilità di inserire nella tabella creata anche il carattere di spazio), dovrei prima di effettuare la lettura, dare un comando di input.nextLine(); a vuoto, così da passare alla riga successiva ed attendere l'input da tastiera? Ho detto una castroneria?
[Kendall] è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
Ricarica delle auto elettriche in 3 minu...
Lucid presenta Gravity Touring, il SUV e...
Meta è stata condannata in Spagna...
Chat di gruppo su ChatGPT: al via la fas...
Ubisoft, dietro la trimestrale rimandata...
Gli sviluppatori di Genshin Impact hanno...
Poltronesofà colpita da ransomwar...
FSD e Autopilot: Tesla aggiorna i dati c...
Conclusa la campagna di osservazione del...
Il punto della situazione sulle offerte ...
Windows compie 40 anni, tra conquiste e ...
Black Friday Smartwatch: Amazfit, Apple,...
Operativo il primo Tesla Supercharger te...
Grok idolatra Elon Musk e lo considera s...
Il telescopio spaziale James Webb ha oss...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 14:52.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v