Conoscenza contro abilità
Il college ci ha insegnato che non c'è una grande differenza tra teoria e pratica. Beh, sicuramente capirai che non è la stessa cosa. Ma non vedi la differenza fondamentale. Eppure ce n'è uno. La maggior parte delle persone mette il segno di uguaglianza tra "lo so" e "posso". Fai? Che ne dite di qualche esempio?- So che fumare mi fa male, ma fumo.
- So che il fast food mi fa male, ma lo mangio.
- Conosco le regole del traffico ma non so guidare.
- So che fare jogging mi fa bene, ma non faccio jogging la mattina.
Hai raggiunto un nuovo livello
Livello 9
1 Risha, Traccia dello stack
- EHI! Oggi ti dirò cos'è la traccia dello stack. Ma prima lascia che ti spieghi cos'è lo stack. - Immagina una pila di carte - incarichi per un certo impiegato. Un nuovo incarico può essere messo in cima alla pila e prenderà un incarico dalla cima di una pila. Pertanto, gli incarichi non verranno eseguiti in base all'ordine di arrivo. Ogni volta che l'impiegato prende l'incarico che arriva per ultimo. Una tale struttura di raccolta è chiamata stack . - In Java, c'è una collezione speciale - Stack. Questa raccolta ha metodi «aggiungi un elemento» e «prendi (prendi/porta via) un elemento». Come già sai, l'ultimo elemento aggiunto verrà preso per primo. - Uhm. Non è difficile, immagino. - Bene. Allora lascia che ti spieghi cos'è una traccia dello stackÈ. - Immaginiamo che in Java la funzione А chiami la funzione B , e quest'ultima chiami la funzione C , che a sua volta chiami la funzione D . Quindi, per uscire dalla funzione B , devi prima uscire dalla funzione C , e per farlo devi uscire dalla funzione D . Questo è molto simile a una pila. - E qual è la somiglianza? - Nella pila, per arrivare a un determinato incarico, devi completare anche tutti gli incarichi messi in cima. - Beh, è una specie di analogia, ma non sono sicuro di aver capito bene tutto. - Guarda qui. In Java uno stack è un insieme di elementi. È come fogli di carta in una pila. Per prendere il terzo dall'alto, devi prendere il secondo foglio, ma prima devi prendere il primo. Puoi sempre mettere e prendere fogli, ma puoi metterli solo sopra e prendere solo dall'alto. Lo stesso vale per la chiamata di funzione. La funzione А chiama la funzione B , quest'ultima chiama la funzione C . Per uscire da А , devi prima uscire da B , e per farlo devi uscire da C . - Apetta un minuto. Se ho capito bene, l'intera pila risulta in «può essere preso solo l'ultimo foglio che è stato messo nella pila» e «prima, l'ultima funzione chiamata dovrebbe uscire». È così? - SÌ. Quindi, la sequenza delle chiamate di funzione è il «function call stack», o semplicemente «call stack». La funzione chiamata last deve essere terminata per prima. Diamo un'occhiata all'esempio: - OK. Tutto è chiaro con la chiamata di funzione, immagino. Ma cos'è questo StackTraceElement ? - Java virtual machine registra tutte le chiamate di funzione. A tale scopo ha una raccolta speciale: una pila. Quando una funzione ne chiama un'altra, JVM inserisce un nuovo elemento StackTraceElement in questo stack. Al termine della funzione, l'elemento viene eliminato dallo stack. Pertanto, questo stack memorizza sempre informazioni aggiornate sullo stato attuale dello «stack di chiamate di funzione». - Ogni StackTraceElementcontiene informazioni sul metodo chiamato. Quindi puoi ottenere il nome di questo metodo usando getMethodName . - L'esempio sopra lo mostra:- Ottieni lo «stack di chiamate»:
- Itera l'array usando il ciclo for-each . Spero che tu non l'abbia dimenticato.
- Stampa i nomi dei metodi su System.out .
2 Diego, Attività sulla visualizzazione della traccia dello stack
- Ehi, Amico! Ecco un piccolo compito per visualizzare sullo schermo una traccia dello stack.Compiti | |
---|---|
1 | Ogni metodo dovrebbe restituire i suoi cinque metodi StackTrace Write che si chiamano a vicenda. Ogni metodo dovrebbe restituire il suo StackTrace. |
2 | StackTrace di nuovo Scrivi cinque metodi che si chiamano a vicenda. Ogni metodo dovrebbe restituire il nome del suo metodo chiamante. È possibile ottenere il metodo chiamante utilizzando StackTrace. |
3 | Il metodo dovrebbe restituire il numero di riga del codice da cui questo metodo è stato chiamato Scrivere cinque metodi che si chiamano a vicenda. Ogni metodo deve restituire il numero di riga del codice da cui è stato chiamato questo metodo. Utilizzare la funzione element.getLineNumber() . |
4 | Traccia dello stack di 10 chiamate Scrivere il codice per ottenere una traccia dello stack di 10 chiamate. |
5 | Il metodo deve restituire un risultato: la profondità della traccia dello stack Scrivere un metodo che visualizzi e restituisca la profondità della traccia dello stack. La profondità della traccia dello stack è il numero dei suoi metodi (il numero di elementi nell'elenco). |
3 Elly, Errori ed eccezioni
- Ehi, Amico! Oggi abbiamo una lezione molto interessante. Ti parlerò delle eccezioni. L'eccezione è un meccanismo speciale per controllare gli errori nel programma. Ecco alcuni esempi di errori che possono verificarsi nel programma:- Il programma tenta di scrivere un file sull'intero disco.
- Il programma tenta di chiamare un metodo di una variabile che memorizza il riferimento null.
- Il programma cerca di dividere un numero per 0.
- Quando si verifica un errore, Java virtual machine crea un oggetto speciale, un'eccezione, contenente tutte le informazioni sull'errore. Per errori diversi ci sono diverse eccezioni.
- Quindi questa eccezione forza il programma a interrompere immediatamente la funzione corrente e la funzione successiva, finché non esce dal metodo principale. Dopodiché il programma termina. Gli sviluppatori Java chiamano questo processo «ripristina lo stack di chiamate».
- Se si verifica un'eccezione all'interno del blocco try , il codice in questo blocco non viene più eseguito, ma viene avviata l'esecuzione del blocco catch .
- Se non si è verificata alcuna eccezione, il blocco try viene eseguito fino alla fine e catch non viene mai eseguito .
4 Elly, RuntimeException, lancia
- Ho deciso di sollevare un altro argomento oggi. In Java, tutte le eccezioni sono divise in due tipi: controllate/controllate e non controllate/non controllate . Le eccezioni controllate devono essere catturate, quelle non controllate possono essere catturate ma non è necessario . - È possibile generare eccezioni in un codice di proposito? - Nel tuo codice, puoi lanciare tu stesso le eccezioni. Puoi persino scrivere le tue eccezioni. Ma approfondiremo questo buco più tardi. Ora impariamo come lavorare con le eccezioni lanciate dalla macchina virtuale Java. - OK. - Se le eccezioni ClassNotFoundException e FileNotFoundExceptionvengono generati (appaiono) in un metodo, il programmatore deve specificarli nella firma di un metodo (intestazione del metodo). Tali eccezioni sono verificate. Ecco come appare di solito: - Quindi, scriviamo solo i lanci ed elenchiamo le eccezioni separate da virgole. Giusto? È così? - SÌ. Ma c'è un'altra cosa interessante. Affinché l'esempio seguente sia stato compilato, il metodo che chiama method1() deve intercettare queste eccezioni o lanciarle in avanti. Se si desidera lanciare un'eccezione verificata, è necessario specificarlo nell'intestazione del metodo . - Ancora una volta, se nel metodo principale si desidera chiamare un metodo che ha nella sua frase di intestazione lancia FileNotFoundException, …allora devi fare una di queste due cose:- per catturare le eccezioni FileNotFoundException, …
Dovrai racchiudere il codice in cui chiami un metodo pericoloso con un blocco try-catch - per non rilevare le eccezioni FileNotFoundException, …
5 Risha, Rolling the call stack, come farlo nelle eccezioni
- Vorrei dirvi qualcosa in più su come funzionano le eccezioni. L'esempio seguente spiega che: - Non capisco. - OK. Spiegherò cosa sta succedendo. - Nell'esempio a sinistra, chiamiamo diversi metodi in ordine concatenato. In method2() creiamo e lanciamo specificamente un'eccezione (per avviare un errore). - L'esempio a destra mostra cosa succede. Guarda il metodo2() . Questo è ciò in cui si trasforma la creazione di un'eccezione: creiamo un oggetto di tipo RuntimeException , lo memorizziamo in una speciale variabile exception e usciamo immediatamente dal metodo – return . - In method1 , dopo la chiamata di method2 c'è un controllo,se c'è un'eccezione o no; se c'è un'eccezione, allora method1 termina immediatamente. Questo controllo viene eseguito implicitamente dopo aver chiamato ogni (!) metodo Java. - Oh! - Esattamente. - Nella colonna a destra nel metodo main ho scritto cosa succede quando un'eccezione viene catturata dal blocco try-catch . Se non si sono verificate eccezioni, il codice continua a essere eseguito come pianificato. Se c'era un'eccezione del tipo specificato in catch , la gestiamo. - E cosa significano throw e instanceof ? - Guarda l'ultima riga a sinistra lancia nuove RuntimeException(s). In questo modo creiamo e lanciamo un'eccezione. Questo è solo un esempio. Non lo faremo finora. - Usando il comando « а instanceof B » nel blocco di destra controlliamo se l'oggetto a ha il tipo B . Ovvero, se l'oggetto archiviato nella variabile exception ha il tipo RuntimeException . È un'espressione logica. - Beh, sta diventando un po' più chiaro.6 Diego, compito di cattura eccezionale
- Guarda qui! Lo zio Diego ha portato pochi compiti a pescare per te. Ti auguro buona fortuna. Penso che ne avrai bisogno. Eh. - Ehi, Amico! Ecco alcune interessanti attività di cattura delle eccezioni.Compiti di cattura | |
---|---|
1 | 1. Eccezione quando si opera con i numeri Cattura l'eccezione che si verifica quando si esegue il codice: int a = 42 / 0; Visualizza l'eccezione sullo schermo, specificandone il tipo |
2 | 2. Eccezione quando si opera con le stringhe Cattura l'eccezione che si verifica quando si esegue il codice: String s = null; Stringa m = s.toLowerCase(); Visualizza l'eccezione sullo schermo, specificandone il tipo. |
3 | 3. Eccezione quando si opera con gli array Cattura l'eccezione che si verifica quando si esegue il codice: int[] m = new int[2]; m[8] = 5; Visualizza l'eccezione sullo schermo, specificandone il tipo. |
4 | 4. Eccezione quando si opera con le raccolte List Cattura l'eccezione che si verifica quando si esegue il codice: ArrayList<String> list = new ArrayList<String>(); Stringa s = lista.get(18); Visualizza l'eccezione sullo schermo, specificandone il tipo. |
5 | 5. Eccezione quando si opera con raccolte di mappe Cattura l'eccezione che si verifica quando si esegue il codice: HashMap<String, String> map = new HashMap<String, String>(null); map.put(null, null); map.remove(null); Visualizza l'eccezione sullo schermo, specificandone il tipo. |
7 Risha, Come funziona la cattura multipla
- Ora, alcune lezioni più interessanti. Mi piace tanto insegnare. - Voglio dirti come funziona una cattura multipla . In realtà è molto semplice: quando si verifica un'eccezione nel blocco try , l'esecuzione del programma viene trasferita al primo catch . - Se il tipo specificato tra parentesi del blocco catch è lo stesso del tipo dell'oggetto eccezione, l'esecuzione del codice inizia all'interno di {}. Altrimenti andiamo alla cattura successiva . Il controllo viene ripetuto lì. - Se non ci sono più blocchi catch , ma l'eccezione non è stata catturata, viene lanciata in avanti e il metodo corrente viene interrotto. - Vedo. Verrà eseguita quella cattura, il cui tipo corrisponde al tipo di eccezione. - Sì giusto. In realtà, è un po' più complicato: il punto è che le classi possono essere ereditate l'una dall'altra. Se la classe «Mucca» è ereditata dalla classe «Animale», l'oggetto del tipo «Mucca» può essere memorizzato non solo in una variabile del tipo «Mucca», ma anche in una variabile del tipo «Animale» . - E allora? - Poiché tutte le eccezioni sono ereditate dalle classi Exception o RuntimeException (che è anche ereditata da Exception ), possono essere tutte catturate usando i comandi catch (Exception e) o catch (RuntimeException e) . - E allora? - Ciò significa che,in primo luogo, puoi rilevare qualsiasi eccezione utilizzando il comando catch(Exception e) . In secondo luogo, l'ordine dei blocchi di cattura è importante. Esempi: - ArithmeticException risultante dalla divisione per 0 viene rilevata nel secondo catch. - Nell'esempio seguente, ArithmeticException viene rilevata nel primo catch , poiché le classi di tutte le eccezioni vengono ereditate da Exception. Quindi, Exception cattura qualsiasi eccezione . - Nell'esempio seguente, l'eccezione ArithmeticException non viene rilevata, ma inoltrata al metodo chiamante. - Beh, ora sta diventando più chiaro. Queste eccezioni non sono così facili. - Sembra solo così. In effetti, è una delle cose più semplici in Java. - Sono in dubbio se esserne contento o arrabbiato per questo...8 Diego, Attività di cattura di eccezioni multiple
- Ehi, Amico! Ieri mi sono ubriacato e ho complicato troppo i tuoi compiti, ma spero che non ci siano rancori da parte tua e li risolverai tutti? È per il tuo bene. Qui:Compiti | |
---|---|
1 | 1. Eccezioni Esiste un metodo che genera due eccezioni ereditate da Exception e le altre due ereditate da RuntimeException : NullPointerException , ArithmeticException , FileNotFoundException e URISyntaxException . Devi catturare NullPointerException e FileNotFoundException , ma non catturare ArithmeticException e URISyntaxException . Come farlo? |
2 | 2. Cattura delle eccezioni Ci sono tre eccezioni sequenzialmente ereditate da Exception : class Exception1 extends Exception class Exception2 extends Exception1 class Exception3 extends Exception2 C'è un metodo, che è descritto come segue: public static void method1() throws Exception1, Exception2, Exception3 Scrivi un catch block per catturare tutti e tre Exception1 , Exception2 e Exception3 |
3 | 3. Cattura di eccezioni selettive 1. Scopri quali eccezioni vengono lanciate dal metodo BEAN.methodThrowExceptions . 2. Il metodo processExceptions() dovrebbe chiamare il metodo BEAN.methodThrowExceptions e gestire le eccezioni: 2.1. se si verifica un'eccezione FileSystemException , registrarla chiamando il metodo BEAN.log e lanciare in avanti 2.2. se si verifica un'eccezione CharConversionException o qualsiasi altra IOException , è sufficiente registrarla chiamando il metodo BEAN.log 3. Aggiungere la classe/tipo dell'eccezione che si sta inoltrando in 2.1. al processoEccezioni()firma del metodo. 4. Gestire l'eccezione rimanente nel metodo main() e registrarla. Usa try..catch Suggerimento: se hai catturato l'eccezione MyException , che non volevi catturare, puoi lanciarla in avanti usando il seguente codice: catch (MyException e) { throw e; } |
4 | 4. Catturare le eccezioni verificate Gestire tutte le eccezioni verificate nel metodo processExceptions() . È necessario visualizzare sullo schermo ogni eccezione verificata che si è verificata. Puoi usare solo un blocco try . |
5 | 5. Catturare le eccezioni non controllate Gestire tutte le eccezioni non controllate nel metodo processExceptions() . È necessario visualizzare sullo schermo una traccia dello stack di ogni eccezione avvenuta utilizzando il metodo printStack() . Puoi usare solo un blocco try . |
9 Professore, Lezione sulle eccezioni
- Oggi abbiamo un argomento super interessante: le eccezioni. All'epoca, quando giovani scienziati e programmatori erano profondamente entusiasti di questo argomento... - Scusa, devo andare in laboratorio. Ecco gli appunti delle lezioni. Penso che lo capirai da solo. Qui: Eccezioni Java (documentazione Oracle) Gestione delle eccezioni in Java (punto Java T) Java - Gestione delle eccezioni (punto tutorial) Gestione delle eccezioni Java di base10 Giulio
- Amigo, cosa ne pensi della lezione di oggi? Il tuo cervello a positroni non ha ancora funzionato? I compiti di Diego sono sufficienti per sfinire chiunque. Beviamoci un momento di birra e rilassiamoci. Sei ancora in piedi?11 Capitano Scoiattoli
- Ciao, soldato! - Buongiorno signore! - Ho delle notizie fantastiche per te. Ecco un rapido controllo per rafforzare le tue abilità. Fallo ogni giorno e migliorerai le tue abilità molto velocemente. Le attività sono appositamente progettate per essere eseguite in Intellij IDEA.Attività aggiuntive da svolgere in Intellij Idea | |
---|---|
1 | 1. Divisione per zero Creare un metodo public static void divisionByZero() , in cui è necessario dividere qualsiasi numero per zero e visualizzare sullo schermo il risultato della divisione. Avvolgi la chiamata al metodo divisionByZero() in un try..catch . Visualizza sullo schermo la traccia dello stack delle eccezioni utilizzando il metodo exception.printStackTrace() . |
2 | 2. Conto alla rovescia da 10 a 0 Scrivi un ciclo per il conto alla rovescia da 10 a 0. Usa Thread.sleep(100) per fare un ritardo; Avvolgi la chiamata di sonno in un try..catch . |
3 | 3. Racchiudere un metodo in un try..catch Leggere i numeri dalla tastiera. Scrivi un codice per leggere i numeri dalla tastiera in un metodo separato readData() . Avvolgi l'intero corpo di questo metodo (l'intero codice all'interno del metodo readData() , ad eccezione della dichiarazione dell'elenco in cui verranno memorizzati i numeri) in un try..catch . Se l'utente inserisce del testo invece di inserire un numero, il metodo deve rilevare l'eccezione e visualizzare sullo schermo tutti i numeri inseriti in precedenza. Visualizza i numeri sullo schermo. Ogni numero dovrebbe essere su una nuova riga. L'ordine dei numeri dovrebbe essere proprio come era in input. |
4 | 4. Convertitore di data Leggere dalla tastiera una data nel formato «18/08/2013» Visualizzare sullo schermo la data nel formato «18 AUG 2013». Utilizzare gli oggetti Date e SimpleDateFormat . |
5 | 5. Vocali e consonanti Scrivi un programma che legga la riga dalla tastiera. Il programma dovrebbe visualizzare sullo schermo due stringhe: 1) la prima stringa dovrebbe contenere vocali 2) la seconda stringa dovrebbe contenere consonanti e caratteri di punteggiatura del testo inserito. Separare i caratteri con spazi. Esempio di input: Stop look listen Esempio di output: oooie stplklstn |
6 | 6. La favola di Cappuccetto Rosso 1. Ci sono cinque classi: Cappuccetto Rosso, nonna, tortino, taglialegna, lupo. 2. Ogni classe ha due campi di tipo ArrayList : kill e ate. 3. Gli oggetti necessari sono già stati creati (cappuccio, nonna, ...). 4. Creare la relazione corretta (chi ha mangiato e ucciso chi) per ottenere la logica di «Cappuccetto Rosso». |
7 | 7. Sposta modifiche statiche Sposta i modificatori statici in modo che il codice venga compilato. |
8 | 8. Elenco di array di numeri Crea un elenco i cui elementi sono array di numeri. Aggiungi all'elenco cinque array di oggetti con lunghezza 5, 2, 4, 7, 0, rispettivamente. Riempi gli array con qualsiasi dato e visualizzali sullo schermo. |
9 | 9. Dieci gatti Crea una classe Cat con un campo String name . Crea un dizionario Map<String, Cat> , aggiungi 10 gatti sul modello «Nome» - «Gatto». Ottenere dalla mappa un insieme di nomi e visualizzare l'insieme sullo schermo. |
Compiti bonus | |
---|---|
1 | 1. Il programma non viene compilato ed eseguito. Aggiustalo. Attività: il programma dovrebbe leggere dalla tastiera due nomi di file e copiare il primo file nella posizione specificata dal secondo nome. |
2 | 2. Aggiungere nuove funzionalità al programma. Vecchio compito: il programma dovrebbe leggere dalla tastiera due nomi di file e copiare il primo file nella posizione specificata dal secondo nome. Nuovo compito: il programma dovrebbe leggere dalla tastiera due nomi di file e copiare il primo file nella posizione specificata dal secondo nome. Se il file (che verrà copiato) con il nome specificato non esiste, il programma dovrebbe visualizzare sullo schermo il messaggio «File non esiste» e riprovare a leggere il nome del file dalla console prima di leggere il nome del secondo file (di destinazione). |
3 | 3. Algoritmo di apprendimento e pratica. Leggi dalla tastiera l'elenco di parole e numeri. Visualizza sullo schermo le parole in ordine crescente ei numeri in ordine decrescente. Esempio di input: Ciliegia 1 Fagiolo 3 Mela 2 0 Anguria Esempio di output: Mela 3 Fagiolo 2 Ciliegia 1 0 Anguria |
GO TO FULL VERSION