Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di Toma81
    Registrato dal
    Jun 2014
    Messaggi
    10

    Stranezze return metodo

    Salve a tutti, mi presento con questo primo topic su un problema che sto riscontrando in un programma.

    Main:

    codice:
    if(mensola.setVolume(libro,np)==-1)
              System.out.println("Posizione non valida");
    if(mensola.setVolume(libro,np)==-2)
              System.out.println("Posizione occupata");
    else
              mensola.setVolume(libro,np);


    Classe Mensola:

    codice:
    public int setVolume(Libro libro,int posizione){    
            if((posizione<0)|(posizione>NUM_MAX_VOLUMI))    //NUM_MAX_VOLUMI=15
                return -1;    //posizione non valida
            if(volumi[posizione]!=null)
                return -2;    //posizione occupata
            volumi[posizione]=libro;
            return posizione;
        }


    Il problema sta nel ritorno del metodo setVolume in quanto ritorna sempre "-2" come se nella posizione data dell'array ci sia già un oggetto.
    Sintatticamente il compilatore non mi dà problemi, potete aiutarmi?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Toma81 Visualizza il messaggio
    Il problema sta nel ritorno del metodo setVolume in quanto ritorna sempre "-2" come se nella posizione data dell'array ci sia già un oggetto.
    Il punto è che facendo 3 volte mensola.setVolume con lo stesso libro/np, il primo probabilmente (anzi quasi certamente, da quanto dici) ha successo e poi chiaramente il secondo fallisce con -2. Quindi il problema è l'uso sbagliato ... non tanto il metodo setVolume in sé.


    Riguardo il setVolume ci sono 2 finezze:
    - Usa || invece che | . Il primo è il OR logico con comportamento "short-circuit". Se posizione<0 è già true, non perde tempo a valutare l'altro operando.
    - NUM_MAX_VOLUMI lo intendi come il numero massimo di volumi oppure come la posizione massima che è ancora lecita? Perché se lo si intende (e dal nome io penserei così) come il numero massimo, allora la sua posizione è esclusa (essendo zero-based), quindi sarebbe più corretto posizione >= NUM_MAX_VOLUMI
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di Toma81
    Registrato dal
    Jun 2014
    Messaggi
    10
    Grazie per la risposta.

    Per quanto riguarda i controlli ho provato a ridurre i controlli in un solo "if", così:

    codice:
    public int setVolume(Libro libro,int posizione){   
            if((posizione<0) || (posizione>NUM_MAX_VOLUMI) || (volumi[posizione]!=null))
                return -1;    //posizione non valida
          
             volumi[posizione]=libro;
             return posizione;
        }

    Ok ho corretto con quello che mi hai detto e l'errore è risolto. Ma quindi non posso mettere più controlli sul ritorno di uno stesso metodo?

  4. #4
    Utente di HTML.it L'avatar di Toma81
    Registrato dal
    Jun 2014
    Messaggi
    10
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Riguardo il setVolume ci sono 2 finezze:
    - Usa || invece che | . Il primo è il OR logico con comportamento "short-circuit". Se posizione<0 è già true, non perde tempo a valutare l'altro operando.
    - NUM_MAX_VOLUMI lo intendi come il numero massimo di volumi oppure come la posizione massima che è ancora lecita? Perché se lo si intende (e dal nome io penserei così) come il numero massimo, allora la sua posizione è esclusa (essendo zero-based), quindi sarebbe più corretto posizione >= NUM_MAX_VOLUMI


    -Si l'OR logico è stato un errore di distrazione oppure nel tentativo di cambiare qualche condizione mi sono dimenticato una |.
    -Per NUM_MAX_VOLUMI intendo l'indice massimo dell'array volumi[], quindi come posizione massima.

    Grazie dell'aiuto!

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Toma81 Visualizza il messaggio
    Per quanto riguarda i controlli ho provato a ridurre i controlli in un solo "if"
    Non era quello il problema.

    Quote Originariamente inviata da Toma81 Visualizza il messaggio
    Ma quindi non posso mettere più controlli sul ritorno di uno stesso metodo?
    Certo che si può ma tu invocavi più volte setVolume. Quello era il problema!

    Quote Originariamente inviata da Toma81 Visualizza il messaggio
    -Per NUM_MAX_VOLUMI intendo l'indice massimo dell'array volumi[], quindi come posizione massima.
    Allora POS_MAX_VOLUMI
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it L'avatar di Toma81
    Registrato dal
    Jun 2014
    Messaggi
    10
    Ah ok perfetto, quindi metto in una variabile il ritorno del metodo è poi faccio i controlli... Ho iniziato da poco a con Java.

    Grazie mille per l'aiuto

  7. #7
    Toglimi solo una curiosità...
    hai valorizzato a null tutte le posizioni dell'array volumi?
    Altrimenti ti andrà sempre in questa posizione...
    codice:
      if(volumi[posizione]!=null)

    perché quando vai a fare:
    codice:
    volumi=new Libro [NUM_MAX_VOLUMI ]
    tutte le posizioni dell'array non vengono messi a null in maniera automatica, viene solo allocato lo spazio per quell'array.
    Poi sarai tu a fare un ciclo (for o while) che ti andrà a settare tutte le posizioni, così come assegni null in questo progetto, dovresti invocare il costruttore in casi differenti.

    Ciao.
    Ultima modifica di schumy2000; 06-11-2015 a 11:25
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da schumy2000 Visualizza il messaggio
    codice:
    volumi=new Libro [NUM_MAX_VOLUMI ]
    tutte le posizioni dell'array non vengono messi a null in maniera automatica
    Sì invece, in un array di N reference istanziato così (quindi non parliamo della inizializzazione con valori in { } ), i reference sono inizialmente tutti null.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it L'avatar di Toma81
    Registrato dal
    Jun 2014
    Messaggi
    10
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Sì invece, in un array di N reference istanziato così (quindi non parliamo della inizializzazione con valori in { } ), i reference sono inizialmente tutti null.
    Stavo giusto per scrive che sul libro su cui sto studiando c'è scritto così, appunto.

  10. #10
    ricordavo male allora...o forse lo confondo con qualche altro linguaggio...
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.