Domanda

Perché non può restituire java con grazia un certo valore, con una divisione per zero e invece ha a che lancerà un'eccezione?

sto ottenendo un ArrayIndexOutOfBoundsException:0 Questo perché a causa damageTaken è in realtà un array di valori che memorizza molti 'danni' diverse.

In Java Sto cercando di creare una barra di avanzamento. Il nostro esempio:. Danni subiti, in un gioco di corse, impostando il valore per l'altezza come percentuale di danni maxmimum consentito prima gameover

All'inizio del programma di damageTaken = 0;

(damageTaken / maximumDamage)

darà numeri compresi tra 0 -. 1

Poi ho solo moltiplicare che per l'altezza della barra di avanzamento, per creare una barra di riempimento di altezza adeguata.

Il programma si blocca. Voglio che la barra di avanzamento per essere di altezza pari a zero!

È stato utile?

Soluzione

Non sei divisione per zero, sei dividendo pari a zero da qualcosa .

E 'completamente permesso prendere due metà di zero. La risposta è zero. Diciamo che sono a zero le mele. Si dividono le mele a zero tra Alice e Bob. Alice e Bob hanno ora entrambi zero mele.

Ma, non è possibile dividere per zero. Diciamo che sono due mele. Ora, si vuole dare queste mele a zero persone. Quante mele fa ogni persona ottiene? La risposta è indefinito, e così la divisione per zero è impossibile.

Altri suggerimenti

(damageTaken / maximumDamage)

Questo vi dà una divisione per lo zero un'eccezione solo se maximumDamage è pari a zero.

Se damageTaken è pari a zero, non c'è nessun problema.

Basta aggiungere un caso speciale per 0;

private int getProgress()
    if (damageTaken == 0) {
        return 0;
    } else {
        return (damageTaken / maximumDamage) * progress.getHeight();
    }
}

Tuttavia , (ed è un grande però) la ragione che si stanno ottenendo divisione per 0 è perché maximumDamage è 0, non damageTaken. Quindi, quello che probabilmente vuole veramente è:

private int getProgress()
    if (maximumDamage== 0) {
        return 0;
    } else {
        return (damageTaken / maximumDamage) * progress.getHeight();
    }
}

fermata Let parlare di illegalità, come se la matematica in divisa della polizia stavano per prendere d'assalto la stanza. ;) Per il ragionamento matematico alla base di questo, questa domanda relativa è utile.

E 'giusto chiedere il motivo per cui, dopo tutto questo tempo, piattaforme di programmazione moderno non gestiscono la divisione per zero errori per noi in qualche modo standard - ma di rispondere alla domanda: Java, come la maggior parte qualsiasi altra piattaforma, genera un errore quando si verifica la divisione per zero. In generale, è possibile:

  • maniglia prima: controllare la variabile da utilizzare come denominatore per lo zero prima di fare la divisione
  • maniglia dopo:. Si può prendere l'eccezione generata quando si verifica la divisione per zero e gestire con garbo

Si noti che, come buona pratica, il secondo metodo è appropriato solo quando non ci si aspetta la variabile mai essere zero in normale funzionamento del sistema .

Quindi sì, avete bisogno di un caso speciale per gestire questa situazione. Benvenuti alla programmazione. ;)

Concettualmente, avendo 4/0 resa qualche numero arbitrario sarebbe peggio di avere un tentativo di raddoppiare un conteggio di 2000000000 resa un conteggio di -294.967.296. La maggior parte dei processori, tuttavia, ignoreranno la maggior parte dei tipi di overflow aritmetico a meno che uno in modo esplicito controlli per questo, ma non possono ignorare un tentativo di divisione per zero a meno che uno in modo esplicito controlli operandi in anticipo (e salta l'operazione se non sono validi). Dato che molti processori hanno flag "overflow", nulla impedirebbe un processore di specificare che un tentativo di divisione per zero dovrebbe semplicemente fare altro che impostare il flag di overflow (un'operazione di divisione successo dovrebbe cancellarlo); codice che vuole scatenare un'eccezione in tal caso un poteva farlo.

ho il sospetto la ragione per il comportamento distinta deriva dai primi giorni di calcolo; l'hardware per un'istruzione di divisione potrebbe giudicare che era completo quando il resto era inferiore al divisore. Se ciò non è mai successo, l'istruzione potrebbe ottenere in fase di stallo fino a quando un circuito di clock di sorveglianza generale (progettato per segnalare un guasto, se per qualsiasi motivo istruzioni smettere di essere giustiziati) cose spento. Hardware per rilevare il problema e uscire senza stallo la CPU sarebbe stato banale per gli standard odierni, ma nei giorni in cui i computer sono stati costruiti da transistor discreti era più economico, e quasi altrettanto efficace, per raccontare i programmatori Non tentare di dividere per zero, mai .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top