Javan päivän käsite

Tavoittamaton koodi :

Java-ohjelman jokaisen lausekkeen on oltava tavoitettavissa eli jokaisen lausekkeen on oltava suoritettavissa vähintään kerran missä tahansa mahdollisessa virtauksessa. Jos jokin koodi ei voi olla suoritettavissa missään mahdollisessa virrassa, sitä kutsutaan tavoittamattomaksi koodiksi. Tavoittamaton koodi javassa on kääntämisaikavirhe.

Katsokaa seuraavaa esimerkkiä. Yritä kääntää tämä esimerkki.

public class UnreachableCodeInJava{void UnreachableCode_method(boolean b){if(b){return;}else{return;}System.out.println("Unreachable Statement"); //Compile Time Error : Unreachable Code}}

Tässä esimerkissä rivi 14 antaa kääntämisaikavirheen : Unreachable Code. Koska tähän lausekkeeseen ei pääse missään virrassa. Jos boolean ”b” on tosi, if-lohko suoritetaan ja ohjaus palautetaan. Jos boolean ”b” on false, else-lohko suoritetaan ja ohjaus palautetaan. Kummassakaan virrassa ohjaus ei siis tule riville 14. Se jää saavuttamatta. Näin ollen se antaa kääntämisaikavirheen.

Katso tätä esimerkkiä.

public class UnreachableCodeInJava{void UnreachableCode_method(boolean b){System.out.println("Reachable Statement");return;System.out.println("Unreachable Statement"); //Compile Time Error}}

Tässä esimerkissä UnreachableCode_method():lla on vain yksi virtaus. Vain tässä virtauksessa kaikki lausekkeet on suoritettava vähintään kerran. Ohjaus palaa kuitenkin vasta toisella lausekkeella. Joten kolmannesta lausekkeesta tulee tavoittamaton.

Kuollut koodi :

Kuollut koodi on myös tavoittamatonta koodia, mutta kuollut koodi ei aiheuta kääntämisaikavirhettä. Se antaa vain varoituksen.
Esimerkiksi,

public class UnreachableCodeInJava{void UnreachableCode_method(boolean b){System.out.println("Reachable Statement");if(true){return;}System.out.println("Unreachable Statement"); //Dead Code}}

Yllä olevassa esimerkissä if-lohko suoritetaan aina, koska annamme sille vakioarvon ”true”. Rivistä 12 tulee siis saavuttamaton. Kääntäjä ei kuitenkaan valita siitä. Se antaa vain varoituksen, jossa sanotaan, että se on kuollutta koodia.

Tehdään nyt pieni muutos yllä olevaan esimerkkiin.Korvataan if-lohko while-lohkolla.Käännetään se ja katsotaan, mitä tapahtuu.

public class UnreachableCodeInJava{static void UnreachableCode_method(boolean b){System.out.println("Reachable Statement");while(true){return;}System.out.println("Unreachable Statement"); //Compile Time Error}}

Tämä esimerkki antaa käännöksen aikana virheen : Unreachable code. Mutta miksi? Miksi kääntäjä muuttaa mielensä kun se näkee while-lohkon? Miksi se ei valita tavoittamattomasta koodista if-lohkon jälkeen?

Tämä johtuu siitä, että,Tavoittamattoman koodin säännöt eri lohkoille, kuten konstruktoreille, metodeille, try:lle, catch:lle, if:lle, for:lle, while:lle jne. on määritelty erikseen Java Language Specificationissa. Javan kielispesifikaation mukaan If-lohkon ehdollista lauseketta ei arvioida kääntämisaikana tavoittamattoman koodin määrittämiseksi. Siksi if-lohkosta ei tule kääntämisaikavirhettä. Voit tarkistaa tavoittamattoman koodin säännöt täältä.

Vastaa

Sähköpostiosoitettasi ei julkaista.