Problem z wyjatkami

0

Otóz pisze program który sitem Erastotenesa wyszukuje i wsazuje liczby pierwsze. Program ma obsługiwać wyjatki. Jako, że jestem początkujacy w Javie nie za bardzo wiem dlaczego mój kompilator gwizda. Kod jest podzielony na dwa pliki. Bład polega na tym ze program nie widzi nowo powstałego obiektu p który jest wepchany w klauzule try mimo że w catchu mam return. Po zakomentowaniu wyjatku pojawia sie również komuniakt o błedzie tym razem w funkcji prime lub w miejscu gdzie ona jest uzyta. Bardzo prosze o pomoc. Podaje kody dwóch plików :

 
class Wyjatek1 extends Exception {}
//class Wyjatek2 extends Exception{};

public class SitoErastotenesa {
	
	private boolean tab[];
	private int n;
	
	void obliczSito()
	{
		int i;
		int j;

		
		for (i = 2; i < n ; i++)
		{
			if (tab[i])
			{	
				for(j = 2*i; j < n ; j+= i ) tab[i] = false;	
			}

		}
		
	}
	
	public boolean prime(int m)
	{
		if (tab[m]) return true;
		else
			return false;
				
	}
	
	SitoErastotenesa(int n) throws Wyjatek1
	{
		if (n <= 0 ) throw new Wyjatek1();
		n = this.n;
		int i;
		tab = new boolean[n + 1];
		
		for(i = 0; i < n + 1; i++)
			tab[i] = true;
		
		tab [0] = tab[1] = false;
	}

}
 

I drugi:

 
public class SitoErastotenesaTest {

	public static void main(String[] args) {
		
		int i;
		int pom1;
		int pom2;
		
		
		try {
			pom1 = Integer.parseInt(args[0]);
			pom2 = Integer.parseInt(args[1]);
		}
		catch (NumberFormatException ex)
		{
			System.out.println("Blad!!");
			return;
		}
		for (i = 0; i < args.length; i++)
		{
			if (pom2 > pom1) pom1 = pom2;
			
			pom2 = Integer.parseInt(args[i]);			

		}
		try {
				SitoErastotenesa p = new SitoErastotenesa(pom1);
		}
		catch (Wyjatek1 e)
		{
			System.out.println("Liczba musi byc dodatnia.");
			return;
		}
		
		p.obliczSito();
		
		for (i = 0; i < args.length; i++)
		{
			if (p.prime(Integer.parseInt(args[i]))) System.out.println(args[i] + " jest liczba pierwsza");
			else System.out.println(args[i] + " jest liczba zlozona");
		}
		
		
		
		return;


	}

}
 
0

Zupełnie złe zastosowanie wyjątków. Wyjątki nie służą do sprawdzania czy użytkownik wpisał liczbę >=0, ani do sprawdzania czy użytkownik wpisał wymagane argumenty.

                int i;
                int pom1;
                int pom2;
               
               if(args.length<2)
               {
                     System.out.println("Program wymaga podania dwoch argumentow");
                     System.exit(0);   // nie  return;
               }
                try 
               {
                        pom1 = Integer.parseInt(args[0]);
                        pom2 = Integer.parseInt(args[1]);
                }
                catch (NumberFormatException ex)
                {
                        System.out.println("Argumenty musza byc calkowite");
                        System.exit(0);
                }
                // Kolejnej pętli nie rozumiem
                if(pom1<=0)
                {
                      System.out.println("... musi byc dodatnia");
                      System.exit(0);
                }
                SitoErastotenesa(pom1);
                .....

Z deiinicji klasy SitoErastotenesa wyrzuć wszystko co się wiąże z wyjątkami.

0

No właśnie nie za bardzo mogę... Właśnie w zadaniu jest : Dodaj odpowiednie własne wyjatki dla tej klasy, np. w przypadku uzycia liczb ujemnych A wczy wiekszych od argumentu konstruktora. A w Twojej korekcie nie ma zadnego wyjatku

0

Palnąłem głupotę, jest za rano :) poszło won.

W bloku catch wystarczy dorzucić wyrzucenie wyjątku IllegalArgumentException.

0

Ale w którym catchu?? Tam gdzie mój wyjątek?? Ale przecież pisałem ze wyjatki muszą być moje, a ten Illegal i tak nie działa... nie wiem co jest nie tak jestem nowy w Javie więc nie za bardzo jeszcze łapie wyjatki. Moze podeśle tekst zadania:

Stwórz klase SitoErastotenesa posiadajaca konstruktor SitoErastotenesa(int
n), który tworzy tablice boolowska odpowiedniego rozmiaru i oblicza na niej sito Erastotenesa
dla liczb od 2 do n. Nastepnie zaimplementuj publiczna metode boolean
prime(int m) zwracajaca true jesli argument n jest liczba pierwsza a false w przeciwnym
przypadku. Funkcja ta powinna prawidłowo działac dla liczb od 2 do n (argument
konstruktora).
Dodaj odpowiednie własne wyjatki dla tej klasy, np. w przypadku uzycia liczb ujemnych
czy wiekszych od argumentu konstruktora.
Stwórz klase SitoErastotenesaTest której metoda main wsród argumentów wywołania
wybierze najwieksza liczbe, utworzy dla niej sito Erastotenesa (korzystajac z poprzednio
utworzonej klasy) i dla kazdego argumentu wywołania poda, czy jest liczba pierwsza
czy złozona (ewentualnie czy jest błedna dana).

Moglibyście sprawdzic co jest nie tak w moim kodzie??

0

Pomysł by sprawdzać znak wprowadzonej liczby za pomocą wyjątków jest zły. Jedynym usprawiedliwieniem może być chęć nauczenia jak sie tworzy swoje wyjątki, ale początkujący chyba nie muszą tego umieć. Powtórzę za @Koziołkiem, zmień nauczyciela.

  1. Można prościej
        public boolean prime(int m)
        {
            return tab[m];

        }
  1. W konstruktorze klasy SitoErastotenesa brak wywołania metody obliczSito()
        public SitoErastotenesa(int n) throws Wyjatek
        {
                .....
                obliczSito();
        }
  1. Zmienna utworzona wewnątrz bloku {} jest poza nim niewidoczna.
                SitoErastotenesa p;
                try
                {
                                p = new SitoErastotenesa(pom1);
                }
                catch (Wyjatek e)
                {
                        System.out.println("Liczba musi byc dodatnia.");
                        return;
                }
0

Całego kodu nie sprawdzę, bo jak już pisałem nie rozumiem do czego służy ta pętla

                for (i = 0; i < args.length; i++)
                {
                        if (pom2 > pom1) pom1 = pom2;
                       
                        pom2 = Integer.parseInt(args[i]);                       

                }
0

Dzięki serdeczne Bohdanos , za to co do tej pory dałeś... a pętla służy do tego żeby znajeźć najwiekszy argument wśród podanych który bedize jednoczesnie rozmiarem tablicy boolenowskiej. Być moze jest xle, ale mi działał jak sprawdząłem... Więc jakbyś był jeszcze bardziej łaskawy to sprawdź dalszą cześc programu, proszęęęę... bo z deczka czuje sie zagubiony w ym światku Javy... A gdyby to bło takie proste zmienić nauczyciela Javy... Ale to chyba mu chodziło o to żebśmy załapali koncepcje wyjatków...

0

1 Wg Twojego algorytmu liczba 666 jest pierwsza.
2. Był błąd w konstruktorze klasy SitoErastotenesa

        public SitoErastotenesa(int n) throws Wyjatek
        {
                if (n <= 0 ) throw new Wyjatek();
                this.n = n; // tu był błąd
                int i;
                tab = new boolean[n + 1];

                for(i = 0; i < n + 1; i++)
                        tab[i] = true;

                tab [0] = tab[1] = false;
                obliczSito();
        }
  1. Ja by trochę uprościł
public class SitoErastotenesaTest {

        public static void main(String[] args) {
               
                int i;
                int pom;
                int max=Integer.MIN_VALUE;

                if(args.length==0)
                {
                        System.out.println("Za malo argumentow");
                        return;
                }
                for(i=0;i<args.length;i++)
                {
                    try 
                    {
                        pom = Integer.parseInt(args[i]);
                        if(pom>max)
                            max=pom;
                    }
                    catch (NumberFormatException ex)
                    {
                        System.out.println("Bledny argument "+args[i]);
                    }
                }
                SitoErastotenesa p;
                try
                {
                     p = new SitoErastotenesa(max);
                }
                catch (Wyjatek e)
                {
                        System.out.println("Liczba musi byc dodatnia.");
                        return;
                }

                p.obliczSito();

                for (i = 0; i < args.length; i++)
                {
                        if (p.prime(Integer.parseInt(args[i]))) 
                            System.out.println("Liczba "+args[i] + " jest pierwsza");
                        else
                            System.out.println("Liczba "+args[i] + " jest zlozona");
                }
                return;
        }

}
  1. Żeby były spełnione warunki zadania, to funkcja prime() też powinna wyrzucać wyjątek.
0

No, dizęki serdeczne, ale jeśli moge to mam kilka pytań jeszcze... czemu tam VALUE_MIN a nie MAX?? I jakie wyjątki ma wyrzucać prime???

0

OK juz sobie poradziłęm... dzięki serdeczne za pomoc i za zainteresowanie... Wszystkim polece to forum w razie problemów... Ciesze się ze uzyskałem pomoc... Dzięki serdeczne Bohdan masz u mnie piwo [browar] [browar] [browar] [browar] [browar] :-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1