Torna indietro   Hardware Upgrade Forum > Software > Programmazione

NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT
NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT
Nelle ultime settimane abbiamo provato tre delle proposte top di gamma di NZXT nelle categorie case, dissipatori e ventole. Rispettivamente, parliamo dell'H9 Flow RGB+, Kraken Elite 420 e F140X. Si tratta, chiaramente, di prodotti di fascia alta che si rivolgono agli utenti DIY che desiderano il massimo per la propria build. Tuttavia, mentre i primi due dispositivi mantengono questa direzione, le ventole purtroppo hanno mostrato qualche tallone d'Achille di troppo
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN è il primo monitor gaming con pannello QD-OLED Gen 5 a layout RGB Stripe Pixel e 360 Hz su 34 pollici: lo abbiamo misurato con sonde colorimetriche e NVIDIA LDAT. Ecco tutti i dati
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Nothing Phone (4a) Pro cambia pelle: l'alluminio unibody sostituisce la trasparenza integrale, portando una solidità inedita. Sotto il cofano troviamo uno Snapdragon 7 Gen 4 che spinge forte, mentre il display è quasi da top dig amma. Con un teleobiettivo 3.5x e la Glyph Matrix evoluta, è la prova di maturità di Carl Pei. C'è qualche compromesso, ma a 499EUR la sostanza hardware e la sua unicità lo rendono un buon "flagship killer" in salsa 2026
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 25-03-2011, 14: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, 14: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, 15: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, 15: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 15:24.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 25-03-2011, 16: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


NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abb...
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz ASUS ROG Swift OLED PG34WCDN recensione: il prim...
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico Recensione Nothing Phone (4a) Pro: finalmente in...
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro WoW: Midnight, Blizzard mette il primo, storico ...
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
CAS Space ha lanciato per la prima volta...
Qualcomm boccia Samsung: i futuri chip S...
Il razzo spaziale cinese Tianlong-3 di S...
Samsung cambia i piani: aumenta la produ...
TSMC non si ferma più: fatturato ...
Xiaomi porta in Italia il nuovo Redmi A7...
Mercato smartphone: Q1 2026 positivo (+1...
YouTube punta sull'AI: gli utenti potran...
Il prossimo chip a 2 nm di Samsung punte...
Due smartphone REDMAGIC sono stati rimos...
La beta della One UI 8.5 è ora di...
Addio al Pannello di Controllo di Window...
Il chip N1 di NVIDIA per i laptop del fu...
YouTube Premium costerà di pi&ugr...
I nuovi Samsung Galaxy A57 5G e A37 5G a...
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: 01:23.


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