Csak akkor olvass tovább, ha a Könyv feladatot megoldottad, vagy nem sikerült megoldani.
Az alap feladatot a fenti linken megtalálod. A feladatban több helyen írtam megjegyzéseket, hogy könnyebben követhető legyen a feladat megoldása. Ha jól megnézed a feladatot, akkor a hibakezelés a program legnagyobb része, a tényleges programműködés (változók kezelése) ehhez képest jóval kevesebb. A feladat megoldását NetBeans project formában innen letöltheted.
Könyv objektum
/**
*
* @author http://webotlet.hu
*/
package webotlet_konyv;
public class Konyv
{
int oldalszam;
int aktualis;
boolean nyitva;
public Konyv()
{
oldalszam = (int) (Math.random() * 101)+50;
aktualis = 0;
nyitva = false;
}
public void kinyit()
{
if( nyitva )
{
System.out.println( "A konyv mar nyitva van." );
return;
}
nyitva = true;
// [1;oldalszam]
aktualis = (int) (Math.random() * oldalszam) + 1;
System.out.println( "Kinyitottad a konyvet a "+aktualis+
" oldalon." );
}
public void bezar()
{
if( !nyitva )
{
System.out.println( "A konyv mar be van zarva." );
return;
}
nyitva = false;
aktualis = 0;
System.out.println( "Bezartad a konyvet." );
}
public void nez()
{
if( nyitva )
{
System.out.println( "A konyv nyitva van a "+aktualis+
" oldalon." );
}
else
{
System.out.println( "A konyv zarva van." );
}
}
public void lapoz( int irany )
{
if( nyitva == false )
{
System.out.println( "A konyv zarva van, nem lapozhato." );
return;
}
// elore lapozas
if( irany > 0 )
{
aktualis++;
System.out.println( "Lapoztal egyet hatra." );
}
// egyebkent hatra lapozas
else
{
aktualis--;
System.out.println( "Lapoztal egyet elore." );
}
if( aktualis == 0 || aktualis == oldalszam + 1 )
{
bezar();
}
}
public void porget( int irany )
{
int elozo, mennyit;
if( nyitva == false )
{
System.out.println( "A konyv zarva van, nem porgetheto." );
return;
}
elozo = aktualis;
// elore porgetes
if( irany > 0 )
{
if( aktualis == oldalszam )
{
System.out.println( "Mar az utolso oldalon tartasz, arra "+
"nem porgetheted." );
return;
}
// a fennmarado oldalak [aktualis+1;oldalszam]
mennyit = (int)(Math.random()*(oldalszam-aktualis))+aktualis+1;
aktualis = mennyit;
System.out.println( "Hatra porgettel "+
Math.abs(elozo-aktualis)+" oldalt." );
}
// egyebkent hatra fele porgetes
else
{
if( aktualis == 1 )
{
System.out.println( "Mar az elso oldalon tartasz, arra "+
"nem porgetheted." );
return;
}
// lehetseges oldalak [1;aktualis-1]
mennyit = (int)(Math.random()*(aktualis-1))+1;
aktualis = mennyit;
System.out.println( "Elore porgettel "+
Math.abs(elozo-aktualis)+" oldalt." );
}
}
@Override
public String toString()
{
return "Konyv{" + "oldalszam=" + oldalszam + ", aktualis=" +
aktualis + ", nyitva=" + nyitva + '}';
}
}
Vezérlő objektum
/**
*
* @author http://webotlet.hu
*/
package webotlet_konyv;
public class Webotlet_Konyv
{
public static void main( String[] args )
{
Konyv k1 = new Konyv();
System.out.println( k1 );
k1.kinyit();
k1.kinyit();
k1.nez();
k1.lapoz( 1 );
k1.nez();
k1.bezar();
k1.bezar();
k1.kinyit();
k1.lapoz( 1 );
k1.nez();
k1.porget( 1 );
k1.nez();
k1.porget( 1 );
k1.nez();
k1.porget( 1 );
k1.nez();
k1.porget( 1 );
k1.nez();
}
}

Udv!
Csak kezdo programozo vagyok, ezert elore is elnezest kerek, ha a kerdesem primitiv.
Addig ertem, hogy a konyv alapalapotban zarva van amit a konstruktorban ”nyitva = false”-al allitunk be . De miert van az, hogy a kinyit() metodus if-jeben ”if(nyitva)”, aminek erteke false es a program megis a ”nyitva = true” allitast veszi figyelembe.
Csak a hibakezeles miatt kell odatenni? Elore is koszi a valaszt. Amugy nagyon jo az oldal, csak igy tovabb.
Amikor ki akarom nyitni a könyvet, meg kell vizsgálnom az aktuális állapotát. Valóban jól látod, a hibakezelés miatt van ott az első if. Nem nyithatom ki kétszer.
Ha már eleve nyitva van: if( nyitva ) …. akkor nem tudom kinyitni még egyszer, és itt meg is áll a dolog. (az nyitva továbbra is true marad)
Ha ez az állítás hamis (zárva van), akkor jut csak el a program az if utáni nyitva = true; sorhoz, vagyis jelzem, most nyitottam ki.