Błąd dodawania do kolekcji

0

magazyn.nowyFilm("Incepcja" , "Jakistam" , 19.99 , "Akcji");

W wypadku powyżej wszystko wykonuje się poprawnie.

	<code>String test_tytul = "ojacie";
	String test_rezyser = "krece";
	double test_cena = 19.99;
	String test_gatunek = "genre";
	magazyn.nowyFilm(test_tytul, test_rezyser, test_cena, test_gatunek);

W tym wypadku nic się nie dodaje (kompilator oczywiście nie zwraca żadnych błędów.
Czy ktoś byłby mi w stanie powiedzieć dlaczego ?
0

Udało mi się dojść do tego, że błąd jest raczej w odczytywaniu kolekcji za pomocą pętli for each:

for(MagazynFilmow p: magazyn.filmy)
	wyj.print(p.toString());

Jednak dalej nie mogę sobie poradzić. Wypisywana jest tylko pierwszy wiersz (pierwsza pozycja) kolekcji.
Co robić ?

0

Zajebiscie. Pokaz metode nowyFilm i klase, ktorej obiektem jest magazyn.

0
public class MagazynFilmow {

	SortedSet <Film> filmy; 
	
	MagazynFilmow(){
		filmy = new TreeSet <Film> ();
	}
	
	void nowyFilm(String tyt, String rez, double c, String gat){
		filmy.add(new Film(tyt,rez,c,gat));
	}	
}
import java.io.*;
import java.util.*;

public class main {
	
	public static void main(String[] args) throws IOException, ClassNotFoundException {
        (...)
		MagazynFilmow magazyn = new MagazynFilmow();
		magazyn.nowyFilm("Incepcja" , "Jakistam" , 19.99 , "Akcji");
		magazyn.nowyFilm("Przykladowy1" , "Przykladowy1" , 20.99 , "Komedia");
		String test_tytul = "Przykladowy2";
		String test_rezyser = "Przykadowy2";
		double test_cena = 19.99;
		String test_gatunek = "dramat";
		magazyn.nowyFilm(test_tytul, test_rezyser, test_cena, test_gatunek);
		
		for(MagazynFilmow p: magazyn.filmy){
						wyj.print(p.toString());
						wyj.flush();}
	}
}
 
0

Przez przypadek wyciąłem definicje strumienia wyjścia:
PrintWriter wyj = new PrintWriter(System.out);

0

Na przyszłość podawaj kompletne przypadki testowe. Ja to skompilowałem (po małych poprawkach) i działa jak należy:
http://www.ideone.com/FsoWV

0

A więc problem dotyczył głównie niesparametryzowanego Comparable. Dzięki!

0

Nie. W Javie jest wymazywanie typów, a więc spokojnie można nie używać Genericsów i na to samo wyjdzie.

http://www.ideone.com/Jrg6g

0

To miałbym jeszcze jeden problem. Mianowicie: do tego dopisane mam dwie metody:

void save(String nazwa) throws IOException{
		ObjectOutputStream plik = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(nazwa)));
		plik.writeObject(filmy);
		plik.close();
	} 

oraz

MagazynFilmow restore(String nazwa) throws FileNotFoundException, IOException, ClassNotFoundException{
		ObjectInputStream plik = new ObjectInputStream(new BufferedInputStream(new FileInputStream(nazwa)));
		MagazynFilmow tmp = (MagazynFilmow)plik.readObject();
		plik.close();
		return tmp;
	}

Przy wywołaniu save:
magazyn.save("baza.txt");
działa miodnie i jak należy zapisuje się do pliku. Jednak przy restore:
magazyn.restore("baza.txt");
wykrzacza się program. kompilator rzecz jasna błędów nie zgłasza. Dostaję wynik:

Exception in thread "main" java.lang.ClassCastException: java.util.TreeSet cannot be cast to MagazynFilmow
	at MagazynFilmow.restore(MagazynFilmow.java:25)
	at main.main(main.java:11)

Jeśli dałbyś radę i to rozwikłać, to będę bardzo wdzięczny.

0
  1. Strumień zserializowanych obiektów oznacza się rozszerzeniem .ser
  2. Treść błędu mówi wszystko. Zresztą to od razu widać w kodzie. Zapisujesz pole z obiektu, a próbujesz wczytać cały obiekt. Jeżeli save jest metodą klasy MagazynFilmów to zamień plik.writeObject(filmy) na plik.writeObject(this)
0

A jak zrobić, aby przy wprowadzaniu zmiennej, którą jest String nie ucinało mi jej przy pierwszej spacji?
Tokenizer zdaje się nie być najlepszym rozwiązaniem

0

Jak zmieniłem plik.writeObject(filmy) na plik.writeObject(this)
to mam następny błąd:

Exception in thread "main" java.io.NotSerializableException: MagazynFilmow
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.writeObject(Unknown Source)
	at MagazynFilmow.save(MagazynFilmow.java:32)
	at main.main(main.java:103)
 
0

Daj mu "implements Serializable".

0

Dzięki Ci wielkie! Mógłbyś jeszcze tylko zerknąć na mój wcześniejszy post?

0

Podaj kod.

0
String tmp_tytul;
						String tmp_rezyser;
						double tmp_cena;
						String tmp_gatunek;
						
						
						wyj.print("\nPodaj tytul: ");wyj.flush(); 
						wej.nextToken();
						tmp_tytul = wej.sval;
						
						wyj.print("Podaj nazwsiko rezysera:");wyj.flush();
						wej.nextToken();
						tmp_rezyser = wej.sval;
						
						wyj.print("Podaj cene: ");wyj.flush();
						wej.nextToken();
						tmp_cena = wej.nval;
						
						wyj.print("Podaj gatunek: ");wyj.flush();
						wej.nextToken();
						tmp_gatunek = wej.sval;

magazyn.nowyFilm(tmp_tytul, tmp_rezyser, tmp_cena, tmp_gatunek);

Chodzi o to, że jeśli przy podawaniu tytułu zrobię odstęp, bo tytuł jest kilkuczłonowy, to kolejne wyrazy zapisują się do kolejnych zmiennych. Np. dla "Poranek Kojota" w zmiennej tmp_tytul zapisuje się "Poranek", a w zmiennej tmp_rezyser - "Kojota"

0

A może użyj klasy java.util.Scanner?

Po co ci tu w ogóle był StringTokenizer?

0

Wczytaj po prostu readLine() z BufferedReadera, a liczby parsuj. Albo Scannerem czytaj nextLine(), bo i tak każdą wartość masz w nowej linii.

0

To teraz mam jeszcze jeden problem. Jest klasa, która przechowuje kolekcję magazyn.
Następnie tworzę osobną klasę, w której tworzę kolekcję koszyk. Jak 'przerzucać' (?) elementy jednej kolekcji do drugiej?

0

Już sobie poradziłem. Została mi ostatnia rzecz:
Jeśli mam zmienną typu int, np. liczba = 7894;
Jak za pomocą klasy Scanner sprawdzić, czy zmienna liczba składa się z dokładnie 4 cyfr? Tak przeglądam te metody z dokumentacji, ale jakoś nic mi nie przypasowało.

0

Klasa Scanner raczej nie ma takiej metody. Wczytaj Integera, potem daj toString().length i po zawodach.

0

Dokładnie tak zrobiłem, ale myślałem, że może jednak gdzieś tą metodę przeoczyłem.

Dzięki !

0

Dopracowuję projekt i odnośnie tego String.length mam problem, ponieważ mam sprawdzać, czy są cztery cyfry, a w takim wypadku będzie to prawda nawet przy czterech dowolnych znakach, także muszę to rozwiązać inaczej. Może miałby ktoś jakiś pomysł ?

0

Ale miałeś wczytać Integera najpierw, a potem na nim zrobić toString().length. Integer nie może zawierać czterech dowolnych znaków. Integer to liczba przecież.

0

Możesz mi napisać jak tego użyć? Bo nie mogę do tego dojść. Zakładając, że mam zmienną o typu int o nazwie pin.
No i chciałbym, aby było tak, że jeśli wpiszę coś innego niż cyfry, to program po prostu wyrzuci, że nie zautoryzowano, zamiast się wykrzaczyć.

0

Już ok, zrobiłem tak jak mówiłeś i działa. Dzięki Wibowit!

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