Kennis versus vaardigheden
College leerde ons dat er geen groot verschil is tussen theorie en praktijk. U begrijpt vast wel dat dat niet hetzelfde is. Maar je ziet het wezenlijke verschil niet. Toch is er een. De meeste mensen plaatsen het gelijkheidsteken tussen "ik weet" en "ik kan". Zul jij? Wat dacht je van een paar voorbeelden?- Ik weet dat roken slecht voor me is, maar ik rook.
- Ik weet dat fastfood slecht voor me is, maar ik eet het wel.
- Ik ken de verkeersregels, maar ik kan niet autorijden.
- Ik weet dat joggen goed voor me is, maar ik jog niet in de ochtend.
Je hebt een nieuw niveau bereikt
Niveau 9
1 Risha, stapeltracering
- Hoi! Vandaag vertel ik je wat de stacktrace is. Maar laat me je eerst uitleggen wat de stapel is. - Stel je een stapel papieren voor - opdrachten voor een bepaalde klerk. Een nieuwe opdracht kan bovenop de stapel worden gelegd, en hij zal een opdracht van de bovenkant van een stapel nemen. Opdrachten worden dus niet gedaan op basis van wie het eerst komt. Elke keer neemt de griffier de opdracht die als laatste komt. Zo'n verzamelingsstructuur wordt een stapel genoemd . - In Java is er een speciale verzameling - Stack. Deze verzameling heeft methoden «voeg een element toe» en «haal (krijg/neem weg) een element». Zoals u al weet, wordt het laatst toegevoegde element als eerste genomen. - Brommen. Het is niet moeilijk, denk ik. - Prima. Laat me dan uitleggen wat een stacktracering isis. - Stel je voor dat in Java functie А functie B aanroept , en laatstgenoemde functie C aanroept , die op zijn beurt functie D aanroept . Dus om functie B te verlaten , moet u eerst functie C verlaten , en daarvoor moet u functie D verlaten . Dit lijkt sterk op een stapel. - En wat is de overeenkomst? - In de stapel, om bij een bepaalde opdracht te komen, moet je ook alle bovenaan gezette opdrachten voltooien. - Het is een beetje een analogie, maar ik weet niet zeker of ik alles goed begrijp. - Kijk hier. In Java is een stapel een verzameling elementen. Het is als vellen papier in een stapel. Om de derde van boven te pakken, moet je het tweede vel pakken, maar daarvoor moet je het eerste nemen. U kunt altijd lakens plaatsen en nemen, maar u kunt ze alleen op de bovenkant leggen en alleen van de bovenkant nemen. Hetzelfde geldt voor de functieaanroep. Functie А roept functie B aan , de laatste roept functie C aan . Om А te verlaten , moet u eerst B verlaten , en om dit te doen moet u C verlaten . - Wacht even. Als ik het goed heb, blijkt de hele stapel in "alleen het laatste vel dat op de stapel is gelegd kan worden genomen" en "eerst moet de laatst aangeroepen functie worden afgesloten". Is dat zo? - Ja. De volgorde van functieaanroepen is dus de «functieaanroepstapel», of kortweg «aanroepstapel». De laatst aangeroepen functie moet eerst worden beëindigd. Laten we naar het voorbeeld kijken: - OK. Alles is duidelijk met de functieaanroep, denk ik. Maar wat is dit StackTraceElement ? - Java virtual machine registreert alle functieaanroepen. Hiervoor heeft het een speciale collectiestapel. Wanneer een functie een andere aanroept, plaatst JVM een nieuw element StackTraceElement in deze stapel. Wanneer de functie eindigt, wordt het element uit de stapel verwijderd. Deze stapel slaat dus altijd up-to-date informatie op over de huidige status van de «function call stack». - Elk StackTraceElementbevat informatie over de aangeroepen methode. U kunt dus de naam van deze methode krijgen met behulp van getMethodName . - Het voorbeeld hierboven laat het zien:- Verkrijg de «callstack»:
- Herhaal de array met behulp van de lus for-each . Ik hoop dat je het niet bent vergeten.
- Druk methodenamen af naar System.out .
2 Diego, Taak op stacktrace-display
- Hé, Amigo! Hier is een kleine taak om een stacktrace op het scherm weer te geven.Taken | |
---|---|
1 | Elke methode moet zijn StackTrace Write vijf methoden teruggeven die elkaar aanroepen. Elke methode moet zijn StackTrace retourneren. |
2 | StackTrace opnieuw Schrijf vijf methoden die elkaar aanroepen. Elke methode moet de naam van de aanroepmethode teruggeven. U kunt de caller-methode verkrijgen met behulp van StackTrace. |
3 | De methode moet het regelnummer teruggeven van de code waarmee deze methode is aangeroepen Schrijf vijf methoden die elkaar aanroepen. Elke methode moet het regelnummer retourneren van de code van waaruit deze methode is aangeroepen. Gebruik de functie element.getLineNumber() . |
4 | Stacktracering van 10 calls Schrijf code om een stacktracering van 10 calls te krijgen. |
5 | De methode moet een resultaat teruggeven - de diepte van de stacktrace. Schrijf een methode die de diepte van de stacktrace weergeeft en teruggeeft. Stack trace depth is het aantal methoden (het aantal elementen in de lijst). |
3 Elly, fouten en uitzonderingen
- Hé, Amigo! Vandaag hebben we een zeer interessante les. Ik zal je vertellen over uitzonderingen. Uitzondering is een speciaal mechanisme om fouten in het programma te controleren. Hier zijn enkele voorbeelden van fouten die kunnen optreden in het programma:- Het programma probeert een bestand naar de volledige schijf te schrijven.
- Het programma probeert een methode aan te roepen van een variabele die de null-referentie opslaat.
- Het programma probeert een getal te delen door 0.
- Wanneer er een fout optreedt, maakt de virtuele Java-machine een speciaal object – een uitzondering – dat alle informatie over de fout bevat. Voor verschillende fouten zijn er verschillende uitzonderingen.
- Dan dwingt deze uitzondering het programma om de huidige functie onmiddellijk te onderbreken, en de volgende functie, totdat het de hoofdmethode verlaat. Daarna wordt het programma beëindigd. Java-ontwikkelaars noemen dit proces "rollback the call stack".
- Als er een uitzondering optreedt binnen het try- blok, wordt de code in dit blok niet meer uitgevoerd, maar begint de uitvoering van de blokvangst .
- Als er geen uitzondering is opgetreden, wordt het try-blok tot het einde uitgevoerd en wordt catch nooit uitgevoerd .
4 Elly, RuntimeException, gooit
- Ik heb besloten om vandaag een ander onderwerp ter sprake te brengen. In Java zijn alle uitzonderingen onderverdeeld in twee typen: gecontroleerd/gecontroleerd en ongecontroleerd/niet-gecontroleerd . Aangevinkte uitzonderingen moeten worden afgevangen, niet-aangevinkte uitzonderingen kunnen worden afgevangen, maar dat is niet vereist . - Is het mogelijk om met opzet uitzonderingen in een code te gooien? - In je code kun je zelf exceptions gooien. U kunt zelfs uw eigen uitzonderingen schrijven. Maar we zullen later diep in dit gat duiken. Laten we nu leren werken met de uitzonderingen die worden gegenereerd door de virtuele Java-machine. - OK. - Als uitzonderingen ClassNotFoundException en FileNotFoundExceptionworden gegooid (verschijnen) in een methode, moet de programmeur ze specificeren in de handtekening van een methode (methodekop). Dergelijke uitzonderingen worden gecontroleerd. Zo ziet het er meestal uit: - Dus we schrijven gewoon worpen en vermelden uitzonderingen, gescheiden door komma's. Rechts? Is dat zo? - Ja. Maar er is nog iets interessants. Om het onderstaande voorbeeld te compileren, moet de methode die methode1() aanroept deze uitzonderingen opvangen of naar voren gooien. Als je de gecontroleerde uitzondering naar voren wilt gooien, moet je dit specificeren in de header van de methode . - Nogmaals, als u in de hoofdmethode een methode wilt aanroepen die in de header-zin FileNotFoundException heeft , ...dan moet je een van deze twee dingen doen:- om uitzonderingen op te vangen FileNotFoundException, …
Je moet de code verpakken waar je een gevaarlijke methode aanroept met een try-catch- blok - om geen uitzonderingen op te vangen FileNotFoundException, …
5 Risha, Rollen van de call-stack, hoe het te doen bij uitzonderingen
- Ik wil je wat meer vertellen over hoe uitzonderingen werken. In onderstaand voorbeeld wordt uitgelegd dat: - Ik snap het niet. - OK. Ik zal uitleggen wat er aan de hand is. - In het voorbeeld links noemen we verschillende methodes in kettingvolgorde. In methode2() maken en gooien we specifiek een uitzondering (om een fout te initiëren). - Het voorbeeld rechts laat zien wat er gebeurt. Kijk naar de methode2() . Dat is waar het maken van een uitzondering in verandert: we maken een object van het type RuntimeException , slaan het op in een speciale variabele uitzondering en sluiten de methode onmiddellijk af – return . - In methode1 is er na de aanroep van methode2 een vinkje,of er een uitzondering is of niet; als er een uitzondering is, wordt methode1 onmiddellijk beëindigd. Deze controle wordt impliciet uitgevoerd na het aanroepen van elke (!) Java-methode. - Wauw! - Precies. - In de kolom rechts in de methode main heb ik geschreven wat er gebeurt als een uitzondering wordt opgevangen door het try-catch- blok. Als er geen uitzondering was, wordt de code gewoon uitgevoerd zoals gepland. Als er een uitzondering was van het type dat is gespecificeerd in catch , dan behandelen we het. - En wat betekenen throw en instanceof ? - Kijk naar de laatste regel aan de linkerkant en gooi nieuwe RuntimeException(s). Op deze manier maken en gooien we een uitzondering. Dit is slechts een voorbeeld. Tot nu toe doen we het niet. - Met behulp van het commando « à instantie van B » in het rechterblok controleren we of het object a het type B heeft . Dat wil zeggen, of het object dat is opgeslagen in de variabele exception, het type RuntimeException heeft . Het is een logische uitdrukking. - Nou, het wordt een beetje duidelijker.6 Diego, taak voor het vangen van uitzonderingen
- Kijk hier! Oom Diego heeft een paar taken voor je meegebracht. Wens je geluk. Ik denk dat je het nodig zult hebben. Hé. - Hé, Amigo! Hier zijn enkele interessante taken voor het vangen van uitzonderingen.Taken vangen | |
---|---|
1 | 1. Uitzondering bij het werken met getallen Vang de uitzondering op die optreedt bij het uitvoeren van de code: int a = 42 / 0; Geef de uitzondering op het scherm weer en geef het type op |
2 | 2. Uitzondering bij het werken met strings Vang de uitzondering op die optreedt wanneer de code wordt uitgevoerd: String s = null; String m = s.toLowerCase(); Geef de uitzondering op het scherm weer en geef het type op. |
3 | 3. Uitzondering bij het werken met arrays Vang de uitzondering op die optreedt wanneer de code wordt uitgevoerd: int[] m = new int[2]; m[8] = 5; Geef de uitzondering op het scherm weer en geef het type op. |
4 | 4. Uitzondering bij het werken met lijstverzamelingen Vang de uitzondering op die optreedt wanneer de code wordt uitgevoerd: ArrayList<String> list = new ArrayList<String>(); Tekenreeks s = lijst.get(18); Geef de uitzondering op het scherm weer en geef het type op. |
5 | 5. Uitzondering bij het werken met kaartverzamelingen Vang de uitzondering op die optreedt wanneer de code wordt uitgevoerd: HashMap<String, String> map = new HashMap<String, String>(null); map.put(null, null); kaart.verwijderen(null); Geef de uitzondering op het scherm weer en geef het type op. |
7 Risha, hoe meerdere vangsten werken
- Nu nog enkele interessante lezingen. Ik vind het zo leuk om les te geven. - Ik wil je vertellen hoe een meervoudige vangst werkt. Eigenlijk is het heel simpel: als er een uitzondering optreedt in het blok try , wordt de uitvoering van het programma overgebracht naar de eerste catch . - Als het type tussen haakjes van de block catch hetzelfde is als het type van het exception-object, dan begint de uitvoering van de code binnen de {}. Anders gaan we naar de volgende vangst . Daar wordt de controle herhaald. - Als er geen catch- blokken meer zijn, maar de uitzondering niet is opgevangen, wordt deze naar voren gegooid en wordt de huidige methode onderbroken. - Ik zie. Die vangst wordt uitgevoerd, waarvan het type overeenkomt met het type uitzondering. - Ja, juist. Eigenlijk is het een beetje ingewikkelder: het punt is dat de klassen van elkaar kunnen worden geërfd. Als de klasse «Koe» is geërfd van de klasse «Dier», kan het object van het type «Koe» niet alleen worden opgeslagen in een variabele van het type «Koe», maar ook in een variabele van het type «Dier» . - Dus? - Aangezien alle exceptions worden geërfd van de klasse Exception of RuntimeException (die ook wordt geërfd van Exception ), kunnen ze allemaal worden opgevangen met de commando's catch (Exception e) of catch (RuntimeException e) . - Dus? - Dit betekent dat,ten eerste kun je elke uitzondering opvangen met behulp van het commando catch(Exception e) . Ten tweede is de volgorde van de catch- blokken van belang. Voorbeelden: - ArithmeticException die het resultaat is van deling door 0 wordt gevangen in de tweede vangst. - In het onderstaande voorbeeld wordt ArithmeticException gevangen in de eerste catch , omdat klassen van alle uitzonderingen worden geërfd van Exception. Uitzondering vangt dus elke uitzondering op . - In het onderstaande voorbeeld wordt de exception ArithmeticException niet opgevangen, maar naar de aanroepende methode gegooid. - Nou, het wordt nu duidelijker. Deze uitzonderingen zijn niet zo eenvoudig. - Het lijkt alleen maar zo. In feite is het een van de eenvoudigste dingen in Java. - Ik twijfel of ik er blij of boos over moet zijn...8 Diego, Meerdere exception catch-taken
- Hé, Amigo! Gisteren werd ik dronken en maakte ik je taken te ingewikkeld, maar ik hoop dat je er geen last van hebt en dat je ze allemaal zult oplossen? Het is voor je eigen bestwil. Hier:Taken | |
---|---|
1 | 1. Uitzonderingen Er is een methode die twee uitzonderingen genereert die zijn geërfd van Exception en de andere twee die zijn geërfd van RuntimeException : NullPointerException , ArithmeticException , FileNotFoundException en URISyntaxException . U moet NullPointerException en FileNotFoundException afvangen , maar niet om ArithmeticException en URISyntaxException af te vangen . Hoe je dat doet? |
2 | 2. Uitzonderingen vangen Er zijn drie uitzonderingen die achtereenvolgens zijn geërfd van Exception : class Exception1 breidt Exception uit class Exception2 breidt Exception1 uit class Exception3 breidt Exception2 uit Er is een methode die als volgt wordt beschreven: public static void method1() gooit Exception1, Exception2, Exception3 Schrijf een catch blok om alle drie Exception1 , Exception2 en Exception3 te vangen |
3 | 3. Selectieve uitzonderingen afvangen 1. Ontdek welke uitzonderingen worden gegenereerd door de methode BEAN.methodThrowExceptions . 2. De methode processExceptions() moet de methode BEAN.methodThrowExceptions aanroepen en uitzonderingen afhandelen: 2.1. als er een uitzondering FileSystemException optreedt, log deze dan in door de methode BEAN.log aan te roepen en 2.2 naar voren te gooien. als er een uitzondering CharConversionException of een andere IOException optreedt, log deze dan gewoon door de methode BEAN.log aan te roepen 3. Voeg de klasse/type van de uitzondering die u doorstuurt toe in 2.1. naar het procesExceptions()methode handtekening. 4. Behandel de resterende uitzondering in de methode main() en log deze. Gebruik try..catch Tip: als je de uitzondering MyException hebt opgevangen , die je niet wilde vangen, kun je deze naar voren gooien met de volgende code: catch (MyException e) { throw e; } |
4 | 4. Aangevinkte uitzonderingen opvangen Behandel alle aangevinkte uitzonderingen in de methode processExceptions() . U moet elke aangevinkte uitzondering die is opgetreden op het scherm weergeven. U mag slechts één blok proberen gebruiken . |
5 | 5. Niet-aangevinkte uitzonderingen afvangen Behandel alle niet-aangevinkte uitzonderingen in de methode processExceptions() . U moet een stacktracering van elke opgetreden uitzondering op het scherm weergeven met behulp van de methode printStack() . U mag slechts één blok proberen gebruiken . |
9 Hoogleraar, Lezing over uitzonderingen
- Vandaag hebben we een super interessant onderwerp - uitzonderingen. In die tijd, toen jonge wetenschappers en programmeurs erg enthousiast waren over dit onderwerp... - Sorry, ik moet naar het lab. Hier zijn de aantekeningen van de colleges. Ik denk dat je er zelf wel achter komt. Hier: Java-uitzonderingen (Oracle-documentatie) Afhandeling van uitzonderingen in Java (Java T-punt) Java - Afhandeling van uitzonderingen (tutorialspunt) Basisafhandeling van Java-uitzonderingen10 juli
- Amigo, wat vind je van de les van vandaag? Is je positronbrein nog niet uitgewerkt? Diego's taken zijn genoeg om iedereen uit te putten. Laten we een biermoment nemen en ontspannen. Sta je nog?11 Kapitein Eekhoorns
- Hallo, soldaat! - Goedemorgen meneer! - Ik heb geweldig nieuws voor je. Hier is een snelle check om je vaardigheden te versterken. Doe het elke dag en je zult je vaardigheden heel snel verbeteren. Taken zijn speciaal ontworpen om te doen in Intellij IDEA.Extra taken te doen in Intellij Idea | |
---|---|
1 | 1. Delen door nul Maak een methode public static void divisionByZero() , waarbij je elk getal door nul moet delen, en toon het resultaat van de deling op het scherm. Verpak de aanroep van de divisionByZero()- methode in een try..catch . Geef de exception stack trace op het scherm weer met behulp van de methode exception.printStackTrace() . |
2 | 2. Aftellen van 10 naar 0 Schrijf een lus om af te tellen van 10 naar 0. Gebruik Thread.sleep(100) om een vertraging te maken; Wikkel het slaapgesprek in een try..catch . |
3 | 3. Verpak een methode in een try..catch Lees getallen van het toetsenbord. Schrijf een code voor het lezen van getallen van het toetsenbord in een aparte methode readData() . Verpak de hele body van deze methode (de volledige code binnen de readData() methode, behalve de declaratie van de lijst waar de nummers zullen worden opgeslagen) in een try..catch . Als de gebruiker wat tekst invoert in plaats van een nummer in te voeren, moet de methode de uitzondering opvangen en alle eerder ingevoerde nummers op het scherm weergeven. Nummers weergeven op het scherm. Elk nummer moet op een nieuwe regel staan. De volgorde van de getallen moet hetzelfde zijn als bij de invoer. |
4 | 4. Datumomzetter Lees van het toetsenbord een datum in het formaat «08/18/2013» Geef die datum op het scherm weer in de vorm van «AUG 18, 2013». Gebruik de objecten Date en SimpleDateFormat . |
5 | 5. Klinkers en medeklinkers Schrijf een programma dat regels van het toetsenbord leest. Het programma moet twee strings op het scherm weergeven: 1) de eerste string moet klinkers bevatten 2) de tweede string moet medeklinkers en interpunctietekens uit de ingevoerde tekst bevatten. Scheid tekens door spaties. Voorbeeld invoer: Stop kijk luister Voorbeeld uitvoer: oooie stplklstn |
6 | 6. Het verhaal van Roodkapje 1. Er zijn vijf klassen: Roodkapje, grootmoeder, patty, houthakker, wolf. 2. Elke klasse heeft twee velden van het type ArrayList : gedood en opgegeten. 3. Noodzakelijke objecten zijn al gemaakt (kap, grootmoeder, ...). 4. Creëer de juiste relatie (wie at en doodde wie) om de logica van "Roodkapje" te begrijpen. |
7 | 7. Verplaats statische wijzigingen Verplaats statische wijzigingen zodat de code wordt gecompileerd. |
8 | 8. Lijst met getallenreeksen Maak een lijst waarvan de elementen getallenreeksen zijn. Voeg aan de lijst vijf objectarrays toe met respectievelijk een lengte van 5, 2, 4, 7, 0. Vul arrays met alle gegevens en geef ze weer op het scherm. |
9 | 9. Tien katten Maak een klasse Kat aan met een veld String name . Maak een woordenboek Map<String, Cat> , voeg 10 katten toe aan het model «Naam» - «Kat». Haal van de kaart een reeks namen op en toon de reeks op het scherm. |
Bonustaken | |
---|---|
1 | 1. Programma compileert en start niet. Maak het. Taak: Het programma leest twee bestandsnamen van het toetsenbord en kopieert het eerste bestand naar de locatie die wordt aangegeven door de tweede naam. |
2 | 2. Voeg nieuwe functionaliteit toe aan het programma. Oude taak: het programma moet twee bestandsnamen van het toetsenbord lezen en het eerste bestand kopiëren naar de locatie die wordt aangegeven door de tweede naam. Nieuwe taak: het programma moet twee bestandsnamen van het toetsenbord lezen en het eerste bestand kopiëren naar de locatie die wordt aangegeven door de tweede naam. Als het bestand (dat gekopieerd gaat worden) met de opgegeven naam niet bestaat, zou het programma op het scherm het bericht «Bestand bestaat niet» moeten weergeven en proberen de bestandsnaam nogmaals van de console te lezen voordat het wordt gelezen. naam van het tweede (bestemmings)bestand. |
3 | 3. Algoritme leren en oefenen. Lees van het toetsenbord de lijst met woorden en cijfers. Toon op het scherm woorden in oplopende volgorde en de nummers in aflopende volgorde. Voorbeeld invoer: Kers 1 Boon 3 Appel 2 0 Watermeloen Voorbeeld uitvoer: Appel 3 Boon 2 Kers 1 0 Watermeloen |
GO TO FULL VERSION