import java.util.Random;
class MójBłąd extends Exception{
private String plik;
@Override public String toString(){return super.toString() + "(" + plik + ")";}
MójBłąd(String plik){this.plik = plik;}
}
class BłądOtwierania extends MójBłąd{ BłądOtwierania(String plik){super(plik);}}
class BłądCzytania extends Exception{ BłądCzytania(String plik){super(plik);}}
class Zasób1 implements AutoCloseable{
private boolean czyMa = false;
private String nazwa;
public Zasób1(String nazwa) throws BłądOtwierania {
if (Zasoby.random.nextDouble() > 0.75)
throw new BłądOtwierania(nazwa);
this.nazwa = nazwa;
System.out.printf("┃ ┌ Zasób1(%s) otwarty.\n",nazwa);
}
public boolean maLiczbę(){
return czyMa = Zasoby.random.nextDouble() > 0.5;
}
public int dajLiczbę() throws BłądCzytania {
if (!czyMa || Zasoby.random.nextDouble() > 0.9)
throw new BłądCzytania(nazwa);
else
return Zasoby.random.nextInt(42);
}
@Override
public void close() throws Exception { // throws Exception można usunąć
System.out.printf("┃ └ Zasób1(%s) zamknięty!\n",nazwa);
}
}
class Zasób2 implements AutoCloseable{
public Zasób2(){
System.out.println("┏━ Zasób2 otwarty.");
}
public void zróbCoś(){}
@Override
public void close() throws Exception { // throws Exception można usunąć
System.out.println("┗━ Zasób2 zamknięty!");
}
}
public class Zasoby {
public static Random random;
public int m(String[] nazwyPlików, int k) throws Exception { // może wystarczy throws BłądOtwierania, BłądCzytania
// szuka w podanych plikach pierwszej liczby którą dzieli k
Zasób2 z2 = new Zasób2();
if (k == 0)
return -1;
for (int i = 0; i < nazwyPlików.length; i++) {
Zasób1 z = new Zasób1(nazwyPlików[i]); // może być wyjątek
while (z.maLiczbę()) {
int wyn = z.dajLiczbę();
if (wyn % k == 0) {
return wyn;
}
}
z.close(); // to na nic... return z wnętrza pętli i tak nie zamknie zasobów...
}
z2.close(); // j.w.
return 0;
}
// zrobić trzy "porządne" wersje m1, m2, m3 metody m, takie żeby otwarte zasoby zawsze były zamykane.
// m1: używając try - catch (koszmarne, tak ma być :)
// m2: używając try - finally <-- zacznij od m2, potem zrób m1 (podobnie do m2), na deser m3
// m3: używając try-z-zasobami
public static void main(String[] args){
random = new Random();
long seed = random.nextLong();
// seed = 40342747495424142L; // Tu można ustawić jakąś "ciekawą" wartość ziarna
System.out.println("Ziarno: " + seed);
random.setSeed(seed);
Zasoby z = new Zasoby();
try {
z.m(new String[]{"raz","dwa","trzy","cztery"}, 13);
} catch (Exception e) {
System.out.println(e);
}
}
}