Untitled
unknown
java
6 months ago
3.1 kB
2
Indexable
Never
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); } } }