2010-05-21 8 views
9

Un possibile motivo perché NullPointerException è un'eccezione di runtime è perché ogni metodo può lanciarlo, quindi ogni metodo dovrebbe avere un "lancio NullPointerException" e sarebbe brutto. Ma questo accade con RemoteException.Perché NullPointerException è un'eccezione di runtime e RemoteException no?

E un possibile motivo perché RemoteException non è un'eccezione di runtime, è quello di dire al client di trattare l'eccezione. Ma ogni metodo in un ambiente remoto ha bisogno di lanciarlo, quindi non c'è alcuna differenza nel lanciare NullPointerException.

Speculazioni? Ero chiaro?

+1

come fanno le persone in un linguaggio che non hanno nemmeno il concetto di eccezioni controllate? cosa puoi fare che non può essere fatto in modo pulito in un'altra lingua? il problema è che le persone considerano i "fallimenti" come un caso speciale invece di rendersi conto che il fallimento è la norma. Questo tipo di persone come le grandi dichiarazioni GOTO giganti che controllano le eccezioni sono. Metodi di prova dello stato? Timeout? Naaaaah. Grandi GOTO giganti * "se la sh! T colpisce la ventola" *. Praticamente una specificità Java e certamente ** NON ** raduna l'intera comunità Java (ad esempio il framework Spring ha un grande odio nei loro confronti). – SyntaxT3rr0r

+5

Webinator, il ragazzo ha posto una domanda perfettamente ragionevole. Non c'è bisogno di sbraitare. – DJClayworth

risposta

17

Non discuterò la decisione, citerò solo la spiegazione della decisione di Ann Wollrath (che guida la progettazione e l'implementazione di Java RMI). Questo viene estratto da questo message dagli archivi RMI-users (messaggio del gennaio 1999):

La decisione di fare RemoteException un verificata un'eccezione e che richiedono remoti metodi per elencare l'eccezione nella sua clausola throws non è uno religioso. La decisione è basata su come rendere affidabile l'elaborazione distribuita . Questa domanda compare una volta in un mentre sul nostro elenco utenti. Ho una risposta dettagliata che ho postato un mentre fa. Eccolo se sei interessato allo . Non riuscivo a trovarlo nell'archivio rmi-user , quindi l'ho incluso sotto .

applausi,

- Ann


mi piacerebbe affrontare il razionale per fare RemoteException un controllato eccezione, piuttosto che un RuntimeException.

1) le reti non sono affidabili

Vorrei che fossero, ma in realtà, non lo sono. Ogni rete ha guasti transitori . È possibile creare la ridondanza di rete , ma il fatto è che la maggior parte delle reti non ha questo. Le intranet hanno errori temporanei, dato che fa Internet. Quindi, ogni RPC effettuato, è soggetto a un errore. I tipi di errori potrebbero non avere nulla da fare con la "rete", di per sé; se il tuo server esaurisce i descrittori di file, il tuo client riceverà un'eccezione . Questo non è un guasto della rete , nel senso che la rete si rompe; il server è in uno stato transitorio di risorse affamato.

RMI non è progettato per gestire solo il caso limitato che l'intera rete si arresta in modo anomalo quando si arresta un singolo computer. Tale rete sarebbe considerata affidabile , o tutto è attivo o tutto è inattivo - non c'è nessun errore parziale . RMI è destinato a un pubblico più generale.

2) RPC fallimento non può essere nascosto dalla cliente

fallimento parziale è la programmazione di un fatto distribuita; questi errori non possono essere nascosti al programma . Si presenta un errore nel client , sia che l'eccezione sia l'eccezione selezionata o non selezionata, che sia ancora presente in . Quindi, come dovrebbero questi errori essere indicati al cliente?

3) eccezioni controllate Foster Altro programmi robusti

C'è stato un tempo in cui la quercia e prima versione di Java non avevano eccezioni controllate. La gestione delle eccezioni era di consulenza, ed era un mondo non sicuro là fuori. Era il nostro gruppo (Jim Waldo e io in particolare :-) che raccomandava che ci fossero delle eccezioni controllate dal compilatore. Jim era piuttosto convincente nelle sue argomentazioni , dicendo a di un mondo in cui il codice robusto avrebbe regnato . Dopo alcune considerazioni, Java è stato riattrezzato per controllare le eccezioni . Solo le eccezioni per che non erano ripristinate o che riflettono gli errori di applicazione sarebbero deselezionate (ad es., OutOfMemoryError, NullPointerException, rispettivamente). E il mondo era di nuovo al sicuro.

Immaginate gli ingegneri Java a sorpresa quando molte eccezioni nella API Java e compilatore sono state modificate da deselezionata per controllare, e il compilatore applicate la distinzione, hanno bug scoperti nelle implementazioni! Quindi, i migliori sforzi nella gestione delle condizioni di errore , per quanto ben intenzionate, non erano abbastanza buone. Questo compilatore è utile per qualcosa :-)

4) RemoteException dovrebbe essere un controllato un'eccezione

Ok, quindi di nuovo in pista qui. Dal momento che una RemoteException è un fatto della vita in una chiamata RPC (vedi # 1, # 2) e controllati eccezioni che costringono a scrivere codice sicuro (# 3), abbiamo pensato che per fare RemoteException un'eccezione controllata era un buona idea. Scrivere robusti programmi distribuiti è abbastanza difficile, senza che il compilatore aiuti con le eccezioni.

Quindi, alcuni potrebbero obiettare che una RemoteException è simile a OutOfMemoryError; il tuo programma dovrebbe fallire se una chiamata remota non riesce. Non sono d'accordo con questo punto. Sì, in in alcuni casi, non c'è ripristino da a RemoteException; ma se si è scrivendo un programma affidabile distribuito , il client deve intercettare gli errori e riprovare in modo appropriato. Forse è necessario contattare un altro server o interrompere una transazione di alcuni ordinamenti . Se RemoteException non è gestito da , verrà filtrato e arresta il client (yuk).

altri hanno detto che ci sono alcune interfacce remote che vengono utilizzati nel sia il caso locale e caso remoto e il cliente non dovrebbe avere a accordo con le eccezioni del caso locale, in modo RemoteException non dovrebbe devono essere in una clausola di tiri e la gestione di non dovrebbe essere obbligatoria. Ora, se consentito interfaccia remota metodi di omettere RemoteException e aveva un interruttore "rmic" per generare stub che gettare un incontrollato RemoteException, il clienteha non scelta in materia. La decisione della gestione delle eccezioni dovrebbe rimanere con il client. Se si definisce un'interfaccia che genera eccezioni non verificate , non è mai possibile scrivere un client che desideri l'aiuto del compilatore per gestire le eccezioni di . Abbiamo già visto dall'esempio precedente che le eccezioni controllate da promuovono il robusto codice .

Un altro problema che è spuntato ora e di nuovo è che gli sviluppatori hanno bisogno di semplicemente tradurre interfacce locali e li usano come interfacce remote. Questo può funzionare per un piccolo insieme di casi, ma se l'interfaccia non è stato progettato con concorrenza e parziale fallimento e chiamata latenza presente, il protocollo catturato dalla interfaccia non può essere opportuno utilizzare nelle distribuzioni Astuccio. Sono passate abbastanza informazioni in tali operazioni per rendere idempotenti le operazioni ? Forse, ma probabilmente non lo è .

Mettere RemoteException in ogni clausola throws può sembrare come un dolore, ma il suo il prezzo da pagare per la scrittura di robuste applicazioni distribuite.

- Ann Wollrath

+1

Sembra abbastanza convinta che le persone non abbiano scritto "robuste applicazioni distribuite" [sic] in lingue che non hanno nemmeno il concetto di eccezioni controllate. Mi piacerebbe avere un po 'di quello che stava fumando lo scorso secolo, sembra forte :) – SyntaxT3rr0r

+7

@Downvoter I ** davvero ** mi chiedo perché questa risposta sia stata downvoted. Anche se non sei d'accordo con l'autore, sto postando il ** riferimento **, non un'opinione. I downtotes emozionali sono ridicoli. –

+1

Non riesco a immaginare perché qualcuno possa scegliere questo valore quando, a prescindere dai propri sentimenti sulle eccezioni controllate, questa è chiaramente la risposta più corretta alla domanda che si potrebbe ottenere. – ColinD

4

C'è molto più potenziale per NullPointerException rispetto a RemoteException. Qualsiasi codice che chiami un metodo su un oggetto (che significa praticamente qualsiasi codice Java) potrebbe potenzialmente generare un valore NullPointerException. Solo il codice RMI può generare uno RemoteException. Questo è un piccolo sottoinsieme di "tutto il codice".

Durante la scrittura delle librerie RMI, i progettisti hanno deciso di fare in modo che il codice client si aspettasse di gestire queste eccezioni. Considerando la natura dell'esecuzione di codice in modalità remota, penso che sia ragionevole.

0

Oltre RemoteException solo applicando al codice java.rmi e javax.rmi pacchetti (e le loro sottopackage), RemoteException è un tipo di IOException, molto simile a SocketException è ... e tutti IOException s sono eccezioni controllate.

+0

Non mi dilungherò, ma questa risposta non è un possibile motivo per non essere una RuntimeException. RemoteException potrebbe essere solo un tipo di eccezione invece di IOExeption. Essere IOException è una decisione presa dopo aver deciso di essere controllata. –

+0

Tutte le eccezioni in Java relative alle comunicazioni sono sottoclassi di 'IOException'. 'IOException' (e qualsiasi altra classe che eredita da' Exception' piuttosto che 'RuntimeException') è un'eccezione controllata, quindi anche le classi che ereditano da essa sono controllate eccezioni. – Powerlord

2

Il modo in cui ho capito che è:

  • RuntimeExceptions sono gettati per cose che erano prevenibili.
  • Le eccezioni vengono generate per cose che erano imprevedibili ma recuperabili
  • Gli errori vengono generati per cose che erano imprevedibili e irrecuperabili.

Ad esempio, NullPointerExceptions può sempre essere evitato e sono pertanto eccezioni non controllate. Una RemoteException potrebbe verificarsi quando si verifica un errore di rete, che non può essere ragionevolmente impedito prima della chiamata al metodo e pertanto viene verificato.

+1

Penso che tu abbia invertito "Eccezioni" e "RuntimeExceptions" nel tuo elenco. 'NullPointerException' è una' RuntimeException'. – Matthew

+0

Aha, si! Grazie – Steve

Problemi correlati