Untitled

mail@pastecode.io avatar
unknown
java
2 years ago
3.1 kB
3
Indexable
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);
        }
    }
}