Tudás vs. készségek
A főiskola megtanította nekünk, hogy nincs nagy különbség elmélet és gyakorlat között. Nos, biztosan megérted, hogy ez nem ugyanaz. De nem látod az alapvető különbséget. Mégis van egy. A legtöbben az egyenlőségjelet a „tudom” és a „tudom” közé teszik. Ön? Mit szólnál néhány példához?- Tudom, hogy a dohányzás rossz nekem, de dohányzom.
- Tudom, hogy a gyorsétterem rossz nekem, de megeszem.
- Ismerem a közlekedési szabályokat, de nem tudok vezetni.
- Tudom, hogy jó nekem a kocogás, de nem kocogok reggel.
Új szintet értél el
9. szint
1 Risha, Stack nyom
- Hé! Ma elmondom, mi az a veremnyom. De először hadd magyarázzam meg, mi az a verem. - Képzeljen el egy köteg papírt - egy bizonyos hivatalnok megbízatását. Egy új feladatot a verem tetejére lehet tenni, ő pedig a verem tetejéről vesz fel egy feladatot. Így a feladatokat nem érkezési sorrendben végzik el. Minden alkalommal, amikor az ügyintéző átveszi az utolsó feladatot. Az ilyen gyűjtési struktúrát veremnek nevezzük . - A Java-ban van egy speciális gyűjtemény - Stack. Ebben a gyűjteményben vannak "elem hozzáadása" és "elem elvétele/elvitele" módszerei. Amint azt már tudja, az utoljára hozzáadott elem kerül először felvételre. - Hum. Nem nehéz, azt hiszem. - Bírság. Akkor hadd magyarázzam el, mi a veremnyomvan. - Képzeljük el, hogy a Java függvényben az А függvény hívja a B függvényt , az utóbbi pedig a C függvényt , amely viszont a D függvényt . Tehát a B funkcióból való kilépéshez először ki kell lépnie a C funkcióból , ehhez pedig ki kell lépnie a D funkcióból . Ez nagyon hasonlít a veremhez. - És mi a hasonlóság? - A veremben ahhoz, hogy egy bizonyos feladathoz eljuss, el kell végezned az összes rárakott feladatot is. - Nos, ez egy hasonlat, de nem vagyok benne biztos, hogy mindent jól értek-e. - Nézz ide. A Java nyelvben a verem elemek halmaza. Olyan, mint a papírlapok egy kötegben. Ahhoz, hogy felülről vegye a harmadikat, el kell vennie a második lapot, de előtte az elsőt. A lepedőket mindig teheted és veheted, de csak a tetejére teheted, és csak felülről veheted. Ugyanez vonatkozik a függvényhívásra is. Az А függvény a B , az utóbbi a C függvényt hívja meg . A А kilépéshez először ki kell lépni B-ből , ehhez pedig ki kell lépni a C- ből . - Várj egy percet. Ha jól tettem, az egész verem a következőképpen jelenik meg: "csak az utolsó lap, amely a veremre került", és "először az utoljára hívott függvénynek kell kilépnie". így van? - Igen. Tehát a függvényhívások sorrendje a "függvényhívás verem", vagy egyszerűen csak "hívás verem". Az utolsóként nevezett függvényt először le kell zárni. Nézzük a példát: - Rendben. Azt hiszem, a függvényhívással minden világos. De mi is ez a StackTraceElement ? - A Java virtuális gép naplózza az összes függvényhívást. Erre a célra egy speciális gyűjtemény - verem. Amikor egy függvény meghív egy másikat, a JVM egy új StackTraceElement elemet helyez el ebbe a verembe. Amikor a függvény véget ér, az elem törlődik a veremből. Így ez a verem mindig naprakész információkat tárol a «függvényhívási verem» aktuális állapotáról. - Minden StackTraceElementinformációkat tartalmaz a hívott metódusról. Tehát ennek a metódusnak a nevét a getMethodName segítségével kaphatja meg . - A fenti példa ezt mutatja:- Szerezd meg a "hívás verem":
- Iterálja a tömböt a ciklus for-each használatával . Remélem nem felejtetted el.
- A metódusnevek nyomtatása a System.out fájlba .
2 Diego, Feladat a verem nyomkövetésén
- Szia Amigo! Íme egy kis feladat a verem nyomvonalának megjelenítéséhez a képernyőn.Feladatok | |
---|---|
1 | Mindegyik metódusnak vissza kell adnia a StackTrace Write öt metódusát, amelyek hívják egymást. Mindegyik metódusnak vissza kell adnia a StackTrace-ét. |
2 | Ismét StackTrace Írjon öt egymást hívó metódust. Minden metódusnak vissza kell adnia a hívó metódusának nevét. A hívómódszert a StackTrace segítségével szerezheti be. |
3 | A metódusnak vissza kell adnia annak a kódnak a sorszámát, amelyet ezt a metódust az Írjon öt egymást hívó metódust. Minden metódusnak vissza kell adnia annak a kódnak a sorszámát, amelyből ezt a metódust hívták. Használja az elem.getLineNumber() függvényt . |
4 | 10 hívás veremkövetése Írjon kódot, hogy 10 hívás veremnyomát kapja. |
5 | A metódusnak eredményt kell visszaadnia - a verem nyomkövetési mélységét Írjon egy metódust, amely megjeleníti és visszaadja a verem nyomkövetési mélységét. A verem nyomkövetési mélysége a metódusainak száma (a listában szereplő elemek száma). |
3 Elly, hibák és kivételek
- Szia Amigo! Ma egy nagyon érdekes leckénk van. Mesélek a kivételekről. A kivétel egy speciális mechanizmus a program hibáinak szabályozására. Íme néhány példa a programban előforduló hibákra:- A program megpróbál egy fájlt írni a teljes lemezre.
- A program megpróbál meghívni egy változó metódusát, amely a null referenciát tárolja.
- A program megpróbál egy számot elosztani 0-val.
- Hiba esetén a Java virtuális gép létrehoz egy speciális objektumot – kivételt –, amely tartalmazza a hibával kapcsolatos összes információt. A különböző hibákhoz különböző kivételek vannak.
- Ekkor ez a kivétel arra kényszeríti a programot, hogy azonnal megszakítsa az aktuális függvényt és a következő függvényt, amíg ki nem lép a fő metódusból. Ezt követően a program leáll. A Java fejlesztők ezt a folyamatot "visszatekerik a hívási verem"-nek nevezik.
- Ha kivétel történik a try blokkon belül, akkor az ebben a blokkban lévő kód már nem fut le, hanem elindul a blokkfogás végrehajtása .
- Ha nem történt kivétel, a try blokk a végéig végrehajtásra kerül , és a catch soha nem kerül végrehajtásra .
4 Elly, RuntimeException, dobások
- Úgy döntöttem, hogy ma egy másik témát hozok fel. A Java-ban az összes kivétel két típusra oszlik: ellenőrzött/ellenőrzött és ellenőrizetlen/ellenőrzött . A bejelölt kivételeket el kell fogni, a nem bejelölteket el lehet fogni , de ez nem kötelező . - Lehet-e szándékosan kivételeket dobni egy kódba? - A kódodban te magad is dobhatsz kivételeket. Akár saját kivételeket is írhatsz. De később belemélyedünk ebbe a gödörbe. Most tanuljuk meg, hogyan kell dolgozni a Java virtuális gépek által kiadott kivételekkel. - RENDBEN. - Ha kivételek ClassNotFoundException és FileNotFoundExceptionmetódusban dobnak (megjelennek), a programozónak meg kell adnia azokat egy metódus aláírásában (metódus fejlécében). Az ilyen kivételeket ellenőrzik. Általában így néz ki: - Tehát csak dobásokat írunk és kivételeket listázunk vesszővel elválasztva. Jobb? így van? - Igen. De van még egy érdekesség. Az alábbi példa összeállításához a method1()-t meghívó metódusnak vagy el kell fogadnia ezeket a kivételeket , vagy előre kell dobnia. Ha a bejelölt kivételt előre szeretné dobni, meg kell adnia a metódus fejlécében . - Még egyszer, ha a fő metódusban olyan metódust akarunk hívni, amelynek fejlécében a FileNotFoundException ,…akkor a következő két dolog egyikét kell tennie:- a kivételek elkapásához FileNotFoundException, … A kódot, ahol veszélyes metódust hív meg, egy try-catch blokkal
kell csomagolnia - hogy ne kapja el a kivételeket FileNotFoundException,…
5 Risha, A hívásverem görgetése, hogyan kell ezt megtenni kivételes esetekben
- Szeretnék egy kicsit többet elmondani a kivételek működéséről. Az alábbi példa ezt magyarázza: - Nem értem. - Rendben. Elmagyarázom, mi a helyzet. - A bal oldali példában több metódust hívunk meg láncrendben. A Method2() -ben kifejezetten kivételt hozunk létre és dobunk (hiba kezdeményezésére). - A jobb oldali példa mutatja, mi történik. Nézd meg a metódust2() . A kivétel létrehozása így alakul: létrehozunk egy RuntimeException típusú objektumot, eltároljuk egy speciális változó kivételben , és azonnal kilépünk a metódusból – return . - Az 1-es metódusban a metódus2 hívása után van egy ellenőrzés,van-e kivétel vagy nincs; Ha van kivétel, akkor a method1 azonnal leáll. Ez az ellenőrzés implicit módon történik az egyes (!) Java metódusok meghívása után. - Azta! - Pontosan. - A Method main jobb oldali oszlopában leírtam, hogy mi történik, ha kivételt elkap a try-catch blokk. Ha nem volt kivétel, a kód a tervek szerint folytatódik. Ha volt kivétel a catch -ben megadott típusból , akkor azt kezeljük. - És mit jelent a dobás és az instanceof ? - Nézd meg a bal oldali utolsó sort, dobj új futásidejű kivétel(eke)t. Ily módon kivételt hozunk létre és dobunk ki. Ez csak egy példa. Egyelőre nem tesszük meg. - A jobb oldali blokkban található « а instanceof B » paranccsal ellenőrizzük, hogy az a objektum B típusú -e . Azaz, hogy a változókivételben tárolt objektum RuntimeException típusú-e . Ez egy logikus kifejezés. - Nos, ez egy kicsit világosabb.6 Diego, Kivételfogási feladat
- Nézz ide! Diego bácsi kevés elkapási feladatot hozott neked. Sok szerencsét. Szerintem szükséged lesz rá. Heh. - Szia Amigo! Íme néhány érdekes kivételfogási feladat.Fogós feladatok | |
---|---|
1 | 1. Kivétel számokkal történő műveleteknél. Fogja meg a kód futtatásakor fellépő kivételt: int a = 42 / 0; A kivétel megjelenítése a képernyőn, megadva annak típusát |
2 | 2. Kivétel a karakterláncokkal végzett műveletek során. Fogja meg a kód futtatásakor fellépő kivételt: String s = null; String m = s.toLowerCase(); A kivétel megjelenítése a képernyőn, megadva annak típusát. |
3 | 3. Kivétel a tömbökkel végzett műveleteknél. Fogja meg a kód futtatásakor fellépő kivételt: int[] m = new int[2]; m[8] = 5; A kivétel megjelenítése a képernyőn, megadva annak típusát. |
4 | 4. Kivétel List gyűjteményekkel való munkavégzés esetén Fogja meg a kód futtatásakor fellépő kivételt: ArrayList<String> list = new ArrayList<String>(); String s = list.get(18); A kivétel megjelenítése a képernyőn, megadva annak típusát. |
5 | 5. Kivétel Map gyűjteményekkel való munkavégzéskor. Fogja meg a kód futtatásakor fellépő kivételt: HashMap<String, String> map = new HashMap<String, String>(null); map.put(null, null); map.remove(null); A kivétel megjelenítése a képernyőn, megadva annak típusát. |
7 Risha, Hogyan működik a többszörös fogás
- Most még néhány érdekes előadás. Nagyon szeretek tanítani. - Szeretném elmondani, hogyan működik a többszörös fogás . Valójában ez nagyon egyszerű: amikor a try blokkban kivétel történik , a program végrehajtása átkerül az első catchre . - Ha a blokkfogás zárójelben megadott típusa megegyezik a kivétel-objektum típusával, akkor a kód végrehajtása a {}-on belül kezdődik. Ellenkező esetben a következő fogáshoz megyünk . Az ellenőrzés ott megismétlődik. - Ha nincs több fogási blokk, de a kivételt nem sikerült elkapni, akkor az előredobásra kerül, és az aktuális metódus megszakad. - Látom. Az a fogás kerül végrehajtásra, amelynek típusa megegyezik a kivétel típusával. - Igen, igaz. Valójában ez egy kicsit bonyolultabb: a lényeg, hogy az osztályok örökölhetők egymástól. Ha a «Cow» osztály az «Állat» osztályból öröklődik, a «Cow» típusú objektum nem csak «Cow» típusú változóban tárolható, hanem egy «Állat» típusú változóban is. . - És akkor mi van? - Mivel az összes kivétel az Exception vagy a RuntimeException osztályból öröklődik (amely szintén az Exception osztályból öröklődik ), mindegyik elkapható a catch (Exception e) vagy a catch (RuntimeException e) parancsokkal . - És akkor mi van? - Ez azt jelenti,először is elkaphat bármilyen kivételt a catch(Exception e) paranccsal . Másodszor, a fogási blokkok sorrendje számít. Példák: - A 0-val való osztásból származó aritmetikai kivételt a második fogás fogja el. - Az alábbi példában az ArithmeticException az első fogásban van elkapva , mivel az összes kivétel osztálya a kivételtől öröklődik. Tehát a kivétel minden kivételt elkap . - Az alábbi példában az ArithmeticException kivételt a rendszer nem fogja, hanem továbbítja a hívó metódushoz. - Nos, most már egyre világosabb. Ezek a kivételek nem olyan egyszerűek. - Csak úgy tűnik. Valójában ez az egyik legegyszerűbb dolog a Java-ban. - Kétlem, hogy örüljek vagy idegeskedjek emiatt…8 Diego, Több kivételfogási feladat
- Szia Amigo! Tegnap berúgtam és túlbonyolítottam a feladataidat, de remélem, nincs benned kemény érzés, és mindegyiket megoldod? Ez a saját érdekedben van. Itt:Feladatok | |
---|---|
1 | 1. Kivételek Létezik egy módszer, amely két kivételt az Exception- ből , a másik kettőt pedig a RuntimeException- ből örökölt : NullPointerException , ArithmeticException , FileNotFoundException és URISyntaxException . A NullPointerException és a FileNotFoundException elkapására van szükség , de az ArithmeticException és az URISyntaxException elkapására nem . Hogyan kell csinálni? |
2 | 2. Kivételek elfogása Három kivétel van, amelyek szekvenciálisan öröklődnek a Kivételtől : class Exception1 kiterjeszti Exception class Exception2 kiterjeszti Exception1 class Exception3 kiterjeszti Kivétel2 Van egy metódus, ami a következőképpen írható le: public static void metódus1() dob Exception1, Exception2, Exception3 Írj egy fogást blokkolja a három kivétel1 , kivétel2 és kivétel3 elkapásához |
3 | 3. Szelektív kivételek elkapása 1. Nézze meg, milyen kivételeket dob a BEAN.methodThrowExceptions metódus . 2. A processExceptions() metódusnak meg kell hívnia a BEAN.methodThrowExceptions metódust , és kezelnie kell a kivételeket: 2.1. Ha kivétel FileSystemException történik, akkor naplózza azt a BEAN.log metódus meghívásával , és dobja előre a 2.2. Ha kivétel CharConversionException vagy bármely más IOException történik, csak naplózza a BEAN.log 3 metódus meghívásával. Adja hozzá a 2.1-ben továbbítandó kivétel osztályát/típusát. a folyamathozKivételek()módszer aláírása. 4. Kezelje a fennmaradó kivételt a main() metódusban, és naplózza. Használja try..catch Tipp: Ha elkapta a MyException kivételt , amelyet nem akart elkapni, akkor a következő kóddal dobhatja előre: catch (MyException e) { throw e; } |
4 | 4. Ellenőrzött kivételek elkapása Kezelje az összes ellenőrzött kivételt a processExceptions() metódusban . Minden egyes ellenőrzött kivételt meg kell jelenítenie a képernyőn. Csak egy blokkpróbát használhat . |
5 | 5. Nem ellenőrzött kivételek elkapása Kezelje az összes nem ellenőrzött kivételt a processExceptions() metódusban . Meg kell jelenítenie a képernyőn az egyes előforduló kivételek veremnyomát a printStack() metódus használatával . Csak egy blokkpróbát használhat . |
9 Professzor, Előadás a kivételekről
- Ma van egy szuper érdekes témánk - kivételek. Abban az időben, amikor a fiatal tudósokat és programozókat nagyon izgatta ez a téma… - Elnézést, el kell mennem a laborba. Itt vannak az előadás jegyzetei. Szerintem rájössz magadtól. Itt: Java kivételek (Oracle dokumentáció) Kivételkezelés Java-ban (Java T pont) Java - Kivételek kezelése (oktatóanyagok pont) Alapszintű Java kivételkezelés10 Julio
- Amigo, mi a véleményed a mai leckéről? A pozitron agyad még nem működött? Diego feladatai elegendőek ahhoz, hogy bárkit is megviseljen. Igyunk egy sört és lazítsunk. Még mindig állsz?11 Kapitány Mókus
- Szia katona! - Jó reggelt uram! - Van egy nagyszerű hírem a számodra. Íme egy gyors ellenőrzés, amellyel erősítheti képességeit. Csináld minden nap, és nagyon gyorsan fejleszted képességeidet. A feladatokat kifejezetten az Intellij IDEA-ban való használatra tervezték.További feladatok az Intellij Idea programban | |
---|---|
1 | 1. Osztás nullával Hozzon létre egy nyilvános static void divisionByZero() metódust , ahol tetszőleges számot kell nullával osztania, és megjelenítenie kell a képernyőn az osztás eredményét. Tekerje a divisionByZero() metódushívást try..catch- be . Jelenítse meg a képernyőn a kivétel verem nyomkövetését a kivétel.printStackTrace() metódus használatával . |
2 | 2. Visszaszámlálás 10-től 0-ig Írjon egy ciklust a visszaszámláláshoz 10-től 0-ig. Használja a Thread.sleep(100) -t a késleltetéshez; Tekerje az alváshívást egy try..catch -be . |
3 | 3. Csomagoljon egy metódust try..catch-be Számok olvasása a billentyűzetről. Írjon egy kódot a számok billentyűzetről történő olvasásához egy külön readData() metódusba . Csomagolja be a metódus teljes törzsét (a readData() metóduson belüli teljes kódot, kivéve a lista deklarációját, ahol a számok tárolódnak) egy try..catch formátumba . Ha a felhasználó szám beírása helyett valamilyen szöveget ír be, a módszernek fel kell fognia a kivételt, és megjelenítenie kell a képernyőn az összes korábban beírt számot. Számok megjelenítése a képernyőn. Minden számnak új sorban kell lennie. A számsorrendnek olyannak kell lennie, mint a bevitelnél. |
4 | 4. Dátum konverter Olvasson be a billentyűzetről egy dátumot «2013.08.18.» formátumban. Jelenítse meg a képernyőn azt a dátumot «2013. AUG. 18.» formában. Használja a Date és SimpleDateFormat objektumokat . |
5 | 5. Magánhangzók és mássalhangzók Írjon programot, amely beolvassa a sorokat a billentyűzetről! A programnak két karakterláncot kell megjelenítenie a képernyőn: 1) az első karakterlánc magánhangzókat tartalmazzon 2) a második karakterlánc mássalhangzókat és írásjeleket tartalmazzon a beírt szövegből. A karaktereket szóközzel válassza el. Példa bemenet: Stop look listen Példa kimenet: oooie stplklstn |
6 | 6. A Piroska meséje 1. Öt osztály van: Piroska, nagymama, pogácsa, favágó, farkas. 2. Minden osztálynak két ArrayList típusú mezője van : killed és ate. 3. A szükséges tárgyak már elkészültek (búra, nagymama, ...). 4. Hozza létre a megfelelő kapcsolatot (ki evett és ölt meg kit), hogy megkapja a „Piroska” logikáját. |
7 | 7. Statikus módosítások mozgatása Mozgassa a statikus módosítókat a kód fordításához. |
8 | 8. Számtömbök listája Hozzon létre egy listát, amelynek elemei számtömbök. Adjon hozzá a listához öt objektumtömböt, amelyek hossza rendre 5, 2, 4, 7, 0. Töltse ki a tömböket bármilyen adattal, és jelenítse meg a képernyőn. |
9 | 9. Tíz macska Hozzon létre egy Cat osztályt egy mezővel String name . Hozzon létre egy szótárt Térkép<String, Cat> , adjon hozzá 10 macskát a «Név» - «Cat» modellhez. Szerezzen be egy névkészletet a térképről , és jelenítse meg a készletet a képernyőn. |
Bónusz feladatok | |
---|---|
1 | 1. A program nem fordul le és nem fut. Javítsd meg. Feladat: A program olvasson be a billentyűzetről két fájlnevet, és másolja az első fájlt a második név által megadott helyre. |
2 | 2. Adjon hozzá új funkciókat a programhoz. Régi feladat: A programnak be kell olvasnia a billentyűzetről két fájlnevet, és át kell másolnia az első fájlt a második név által megadott helyre. Új feladat: A programnak be kell olvasnia a billentyűzetről két fájlnevet, és át kell másolnia az első fájlt a második név által megadott helyre. Ha a megadott nevű fájl (amelyet másolni fog) nem létezik, a programnak a képernyőn a „Fájl nem létezik” üzenetet kell megjelenítenie, és meg kell próbálnia még egyszer beolvasni a fájlnevet a konzolról, mielőtt elolvasná a a második (cél) fájl neve. |
3 | 3. Algoritmus tanulása és gyakorlása. Olvassa el a billentyűzetről a szavak és számok listáját. Jelenítse meg a képernyőn a szavakat növekvő, a számokat pedig csökkenő sorrendben. Példabevitel: Cseresznye 1 bab 3 alma 2 0 görögdinnye Példa kimenet: alma 3 bab 2 cseresznye 1 0 görögdinnye |
GO TO FULL VERSION