wyjątki początkujący

0

hej,

przerabiając kurs Javy robię kolejne zadania i mam problem z następującym:
"Napisz kod klasy TablicaPunktow przechowującej do czterech obiektów typu Punkt oraz testowy program ilustrujący różne sytuacje powstające przy korzystaniu z obiektu tej klasy (zadbaj o przechwytywanie wyjątków). Klasa ma zawierać jedynie dwie metody:
pierwszą — przyjmującą trzy argumenty typu int i ustawiającą współrzędne x i y punktu przechowywanego pod zadanym indeksem tablicy, oraz drugą — zwracającą referencję do punktu znajdującego się pod wskazanym indeksem. Program ma odpowiednio reagować, gdy następuje próba użycia nieistniejącego indeksu tablicy, a także wtedy, gdy następuje próba zmiany współrzędnych nieistniejącego punktu (punkt powinien zostać wówczas utworzony)."

Stworzyłem 3 klasy ale efekt moich wypocin jest raczej żałosny...
proszę o pomoc.

moje kody:

public class Punkt {
	public int x;
	public int y;
}

public class TablicaPunktow {
	Punkt a = new Punkt();
	Punkt tab[] = new Punkt[10];
	public void ustawWspolrzedne(int wartosc, int wspX, int wspY) {
		a = tab[wartosc];
		a.x = wspX;
		a.y = wspY;
	}
	public Punkt pobierzWspolrzedne(int wartosc) {
		a = tab[wartosc];
		return a;
	}
}

public class Main {
	public static void main(String args[]) {
		TablicaPunktow zadanie = new TablicaPunktow();
		try {
		zadanie.ustawWspolrzedne(2, 5, 5);
		}
		catch(NullPointerException e) {
			System.out.println("Wskazana niezainicjowana zmienna");
		}
		zadanie.pobierzWspolrzedne(4);
		System.out.println(zadanie.a);
		try {
			zadanie.b.x = 100;
			zadanie.b.y = 200;
		}
		catch(Exception e) {
			Punkt b = new Punkt();
			b.x = 100;
			b.y = 200;
		}
		System.out.println(zadanie.b.x);
		System.out.println(zadanie.b.y);
	}
}
0

Nie ma najgorzej - zacznijmy powoli, od klasy TablicaPunktow.
Po co Ci w niej pole a?

0

jest to referencja do obiektu przypisanemu elementowi tablicy o indeksie [wartosc].
tak zrozumiałem, że każdemu elementowi tablicy przypisujemy obiekt któremu z kolei przypisujemy pola x oraz y

0

Nie odpowiedziałeś na moje pytanie.

0

Dodaj sobie konstruktor ustawiający pola w klasie Punkt.

0
estudiante napisał(a):

jest to referencja do obiektu przypisanemu elementowi tablicy o indeksie [wartosc]
.

Zgadza się, ale tylko w bardzo specyficznym przypadku. Więc ogólnie to nie jest referencja do obiektu, o którym piszesz.

0

Cztery wskazówki ode mnie.

  1. Rozpisz to sobie na Gettery i Settery i tak ustawiaj współrzędne - uhigieniczni Ci to kod chociaż bedzie on obszerniejszy.
  2. Niepotrzebny Ci Punkt A - aby uzyskać referencję do obiektu tablicy wystarczy się do niego odwołać.
  3. Napisałbym własny mechanizm pilnujący czy tablica nie jest przepełniona i czy nie próbujesz odwołać się do nieistniejącego jej elementu - użyłbym do tego jakiejś zmiennej pomocniczej - żeby nie wchodzić w niepotzrebne kontakty z nullpointerem(kabała, przesądy...).
  4. Staraj się pisać wszystko po angielsku, nawet jak w książce, z której się uczysz jest inaczej - od angielskiego nie uciekniesz, dużo czasu Ci to nie zabierze, a w przyszłości łatwiej będzie Ci analizować czyjś kod(prawdopodobnie po angielsku).

EDIT: Najlepiej napisz to jeszcze raz. PAMIĘTAJ że w jednym pliku *.java może być tylko jedna klasa publiczna.
EDIT2: metoda ustawWspolrzedne() jest do totalnej przebudowy. Wartość przypisujesz POLU tablicu a nie POLEM tablicy.

0

dalej nie potrafię sobie z tym poradzić.
na pewno brzmi to laicko ale nie rozumiem jak "1. Rozpisz to sobie na Gettery i Settery i tak ustawiaj współrzędne"
reszta uwag jest zrozumiała i jak najbardziej słuszna (co do punktu 3 to wynika z treści zadania dlatego musi zostać).

podpowiedzcie proszę jak zmodyfikować te kody.

0

Dobra, bo widzę, że inaczej nie da rady. Przeczytaj ten kurs jeszcze raz. Od początku. Albo jakiś inny podstawowy. Od początku. Niczego nie pomijaj. Podpowiedzi miałeś już dość, żeby poprawić ten kod, ale Ty nadal nie wiesz jak to zrobić, bo:

  • oczekujesz gotowego rozwiązania
  • masz braki w podstawach.

Jeśli oczekujesz gotowego rozwiązania, to nigdy się niczego nie nauczysz. Jeśli masz braki w podstawach (tak sądzę), to czytaj ten kurs (i inne) od początku.

Co do kodu:

  1. W jednym pliku może być tylko jedna klasa - takie są wymogi w Javie (jeśli się mylę i chodzi o klasę publiczną, to niech ktoś mnie poprawi). Czyli na samym początku masz już problem, bo w jednym pliku masz 3 klasy publiczne.
  2. Nazewnictwo. Nazywaj klasy, zmienne i wszystko inne po angielsku. To, że w książce jest napisane: "TablicaPunktow", to Ty zrób po swojemu i nazwij tą klasę: "PointArray". W rzeczywistym świecie są pojedyncze wyjątki firm, które stosują polskie nazwy w klasach, metodach itd. Wszyscy normalni programują po angielsku. Także od razu się do tego przystosowuj, żebyś potem nie wpadł na ścianę.
  3. Klasa TablicaPunktow. Pole "a" jest Ci zupełnie do niczego nie potrzebne. Nie pełni w ogóle żadnej roli. Pole (zmienna globalna dla klasy) tworzy się wtedy, kiedy różne metody w klasie mają mieć do niej dostęp. Tutaj jedynym takim polem jest tablica tab[], ponieważ różne metody w klasie muszą mieć do niej dostęp.
  4. Metoda ustawWspolrzedne. Po pierwsze nie potrzebujesz tutaj żadnej zmiennej, wystarczy że zrobisz tak:
 
tab[wartosc].x = wspX;
tab[wartosc].y = wspY;

Przy okazji nazewnictwo.
zmienna wartosc powinna nazywać się index (ponieważ to jest indeks tablicy). Zmienne wspX i wspY powinny nazywać się po prostu x i y lub xValue, yValue albo jakoś tak.

A teraz pytanie. Co się stanie, jeśli będziesz miał wywołanie tej metody z indeksem równym 100?
Np: ustawWsplrzedne(100, 10, 20);

Program Ci się wywali, ponieważ wykraczasz poza indeks tablicy tab. I o tym jest mowa w zadaniu jeśli chodzi o

Program ma odpowiednio reagować, gdy następuje próba użycia nieistniejącego indeksu tablicy, a także wtedy, gdy następuje próba zmiany współrzędnych nieistniejącego punktu (punkt powinien zostać wówczas utworzony).

Odpowiednia reakcja to np. wyrzucenie wyjątku.

Jeśli chodzi o metodę pobierzWspolrzedne, to prawie dobrze. Ale wystarczy:

return tab[index];

Oczywiście wcześniej musisz się upewnić, czy index nie przekracza wartości tablicy (zgodnie z treścią zadania).

Następnie, zadanie mówiło, że Twoja klasa ma przechowywać do czterech obiektów typu punkt. Natomiast Twoja przechowuje do 10.

Teraz wyrzuć ten kod do śmieci i na podstawie naszych postów napisz poprawny :)

0

@estudiante pa na to:
http://www.javawithus.com/tutorial/get-and-set-methods

Get/Set. Mega potrzebne, ale i nietrudne.

0

Gettery i settery tutaj raczej tylko do klasy Punkt by się nadały. Ale przy tak prostej konstrukcji nie są właściwie potrzebne. Chyba tylko po to, żeby trzymać się pewnej konwencji.

0

Hej,

starałem się "użyc" wszystkich informacji z Waszych postów (poza stworzeniem konstruktora bo nie wiem co miałby mi pomóc - jeśli to jest kluczem do sukcesu to dajcie proszę jeszcze jedną wskazówkę) i wyszło mi poniższe(program oczywiście dalej nie działa i będę bardzo wdzięczny za kolejne instrukcje):

public class Point {
	public int x;
	public int y;
}
public class PointArray {
	Point tab[] = new Point[4];
	public boolean errorOccured = false;
	public void setCoordinates(int index, int valueX, int valueY) {
		if(index >= tab.length || index < 0) {
			errorOccured = true;
		}
		else {
			errorOccured = false;
			tab[index].x = valueX;
			tab[index].y = valueY;
		}
	}
	public Point getCoordinates(int index) {
		if(index >= tab.length || index < 0) {
			errorOccured = true;
			return new Point();
		}
		else {
			errorOccured = false;
			return tab[index];
		}
	}
}
public class Main {
	public static void main(String args[]) {
		PointArray task = new PointArray();
		task.setCoordinates(3, 5, 5);
		Point number = task.getCoordinates(2);
			if(task.errorOccured) {
				System.out.println("Inappropriate table index");
			}
			else {
				System.out.println(number);
			}
		try {
			task.setCoordinates(3, 5, 5);
		}
		catch(NullPointerException e) {
			System.out.println("Inappropriate table index");
		}
		try {
            		task.b.x = 100;
            		task.b.y = 200;
       	 	}
        	catch(Exception e) {
            		Point b = new Point();
            		b.x = 100;
            		b.y = 200;
        	}
	}
}

Największy problem będę zdaje się miał z Program ma odpowiednio reagować, gdy następuje próba użycia nieistniejącego indeksu tablicy, a także wtedy, gdy następuje próba zmiany współrzędnych nieistniejącego punktu (punkt powinien zostać wówczas utworzony).

0
  1. Nie baw się w żadne errorOccured, to nie czasy C - rzucaj wyjątki.
  2. Dlaczego nazwałaś zmienną task?
  3. Zobacz sobie w słowniku definicję inappropriate ;-) (podpowiedź: invalid)
0

Dzięki za kolejne podpowiedzi.
Program nie widzi problemu ze zmienną "errorOcurred" - problem pojawia się przy drugiej części zadania tj: Program ma odpowiednio reagować, gdy następuje próba użycia nieistniejącego indeksu tablicy, a także wtedy, gdy następuje próba zmiany współrzędnych nieistniejącego punktu (punkt powinien zostać wówczas utworzony).
czy ma ktoś pomysł jak się do tego zabrać?

0
estudiante napisał(a):

Dzięki za kolejne podpowiedzi.
Program nie widzi problemu ze zmienną "errorOcurred"

Fajnie, że program nie widzi. Ale my widzimy i Ty też powinnaś. Przeczytaj jeszcze raz punkt pierwszy posta Patryka.

0

@estudiante tej zmiennej errorOccured używasz trochę niezręcznie. Ja bym napisał funkcję, która sprawdza dane i zwraca true/false w zalezności od poprawności.

public static boolean validate(parameters){
    if(...)
        return true;
    else 
        return false;
}
0

Nie, tam ma być wyrzucany wyjątek.

0

Zrób coś takiego:

/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

class Point
{
	public int X;
	public int Y;
}

class PointArray
{
	private Point[] array;
	public PointArray(int size) throws Exception
	{
		if(size <= 0) throw new Exception("Array size less equal zero.");
		this.array = new Point[size];
	}
	
	public void SetCoordinates(int index, int x, int y) throws Exception
	{
		if(index < this.array.length && index > 0)
		{
			this.array[index].X = x;
			this.array[index].Y = y;
		}
		else throw new Exception("Array index out or range.");
	}
	
	public Point GetCoordinates(int index) throws Exception
	{
		if(index < this.array.length && index > 0)
		{
			return this.array[index];
		}
		else throw new Exception("Array index out or range.");
	}
}

class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		try
		{
			// Kiedy wpiszesz tutaj głupoty w argumentach to zostanie wyrzucony wyjątek.
			PointArray pa = new PointArray(1);
			pa.SetCoordinates(1,1,1);
			Point point = pa.GetCoordinates(2);
		}
		catch(Exception ex)
		{
			System.out.println(ex);
		}
	}
}

https://ideone.com/v1qwpS

0

Trochę odkopuje, ale również trafiłem na to zadanie w książce i rozgryzłem w inny sposób. Być może komuś się również przyda.

public class TablicaPunktow {
    Punkt tablica[] = new Punkt[4];

        public void ustaw(int x, int y, int index){
            try {
                tablica[index].x = x;
                tablica[index].y = y;
            }
            catch(NullPointerException e){
                tablica[index] = new Punkt();
                tablica[index].x = x;
                tablica[index].y = y;
                System.out.println("Próba zmiany współrzędnych nieistniejącego Punktu\nUtworzono nowy punkt o indeksie " + index);
            }
        }
    
    public Punkt pobierz(int index){
            return tablica[index];
        }

}
class Punkt{
    int x;
    int y;

    void getWsp(){
        System.out.println(x + " " + y + "\n");
    }
}
public class TestTablica {
    public static void main(String[] args) {
        Punkt p1;
        Punkt p2;
        Punkt p3;
        Punkt p4;

        TablicaPunktow tablica = new TablicaPunktow();
        try {
            // ustawienie pierwszego punktu:
            tablica.ustaw(4, 5, 0);
            p1 = tablica.pobierz(0);
            p1.getWsp();

            //drugi punkt
            tablica.ustaw(6, 6, 1);
            p2 = tablica.pobierz(1);
            p2.getWsp();

            //trzeci punkt
            tablica.ustaw(77, 77, 2);
            p3 = tablica.pobierz(2);
            p3.getWsp();

            //czwarty punkt zgłasza wyjatek
            tablica.ustaw(88, 99, 3);
            p4 = tablica.pobierz(4);
            p4.getWsp();
        }
        catch(ArrayIndexOutOfBoundsException e){
            System.out.println("Próbujesz odwołać się do nieistniejącego indexu\n"+ e);
        }
    }
}

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