Wątek przeniesiony 2015-11-18 06:48 z Java przez bogdans.

Java - niezdefiniowany konstruktor (?)

0

czesc, mam maly problem i w zasadzie nie do konca wiem jak go wytlumaczyc, robie taki multiprogram sobie i jedna z funkcji jest test wiedzy, wykorzystalem listy tablicowe w tym celu, wiem, ze moglem to zrobic prosciej, ale probuje sobie cwiczyc rozne warianty.. i problem lezy w tym, ze nie moge zadeklarowac w glownej klasie obiektu, ktory wywolywalby metode testu z innej klasy, wklejam kod:

 import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.ArrayList;

public class Main {

	public static void main(String[] args) throws FileNotFoundException  {
Scanner sc = new Scanner(System.in);
Kalkulator kalk = new Kalkulator();
TestWiedzy testwiedzy = new TestWiedzy(); - **foo** tutaj jest blad - "the constructor TestWiedzy() is undefined"

{
boolean run = true;

while (run){


System.out.println("***Witaj w moim multiprogramie***");
System.out.println("***Wybierz jedna z podanych funkcji wpisujac przypisana jej cyfre***");
System.out.println("1. Prosty kalkuator");
System.out.println("2. Krotki test wiedzy z geografii");
System.out.println("3. Notatnik");
System.out.println("4. Wyjscie");


int wybor = sc.nextInt();

switch (wybor)
{
case 1:
	kalk.kalkulator();
break;

case 2:
	testwiedzy.test();
break;

case 3:
	// in progress //
break;

case 4:
	System.exit(wybor);
break;

default:
    System.out.println("Taka opcja nie istnieje");
break;


}
}
}
	}
}

a to klasa TestWiedzy oraz PytaniaDoTestu

 import java.util.ArrayList;
import java.util.Scanner;



public class TestWiedzy extends PytaniaDoTestu {

	public TestWiedzy(ArrayList<PytaniaDoTestu> p) {
		super(p);
	}


	Scanner sc = new Scanner(System.in);
	int punkty;
	
	
	void test(){
		System.out.println("Wybrales opcje testu, teraz sprobuj odpowiedz na 10 pytan wpisujac odpowiednia odpowiedz mala litera");
		System.out.println("Powodzenia!");
		System.out.println(pytania.get(1));
		System.out.println(odpowiedzi.get(1));
		String odp1 = sc.nextLine();
		if (odp1.equalsIgnoreCase("b")) punkty++;
		System.out.println(pytania.get(2));
		System.out.println(odpowiedzi.get(2));
		String odp2 = sc.nextLine();
		if (odp2.equalsIgnoreCase("b")) punkty++;
		System.out.println(pytania.get(3));		
		System.out.println(odpowiedzi.get(3));
		String odp3 = sc.nextLine();
		if (odp3.equalsIgnoreCase("a")) punkty++;
		System.out.println(pytania.get(4));
		System.out.println(odpowiedzi.get(4));
		String odp4 = sc.nextLine();
		if (odp4.equalsIgnoreCase("a")) punkty++;
		System.out.println(pytania.get(5));
		System.out.println(odpowiedzi.get(5));
		String odp5 = sc.nextLine();
		if (odp5.equalsIgnoreCase("b")) punkty++;
		System.out.println(pytania.get(6));
		System.out.println(odpowiedzi.get(6));
		String odp6 = sc.nextLine();
		if (odp6.equalsIgnoreCase("b")) punkty++;
		System.out.println(pytania.get(7));
		System.out.println(odpowiedzi.get(7));
		String odp7 = sc.nextLine();
		if (odp7.equalsIgnoreCase("d")) punkty++;
		System.out.println(pytania.get(8));
		System.out.println(odpowiedzi.get(8));
		String odp8 = sc.nextLine();
		if (odp8.equalsIgnoreCase("c")) punkty++;
		
		System.out.println("Zdobyles " +punkty+ " punktow na 8 mozliwych");
		
		return;
	}
	}
 import java.util.ArrayList;

public class PytaniaDoTestu {
ArrayList<PytaniaDoTestu> pytania = new ArrayList<>(8);	
ArrayList<PytaniaDoTestu> odpowiedzi = new ArrayList<>(8);

public PytaniaDoTestu(ArrayList<PytaniaDoTestu> p){
	p = pytania;
}

	public PytaniaDoTestu(String string) {
	
}

	{
	pytania.add(1, new PytaniaDoTestu( "W jakim województwie lezy Zambrow?"));
	pytania.add(2, new PytaniaDoTestu( "Jaka jest stolica Portugalii?"));
	pytania.add(3, new PytaniaDoTestu( "Jakie gory oddzielaja Europe i Azje?"));
	pytania.add(4, new PytaniaDoTestu( "Czy Malta nalezy do Unii Europejskiej?"));
	pytania.add(5, new PytaniaDoTestu( "Ktore miasto w USA jest najwieksze?"));
	pytania.add(6, new PytaniaDoTestu( "Na jakim morzu lezy Kuba?"));
	pytania.add(7, new PytaniaDoTestu( "Tirana jest stolica jakiego panstwa?"));
	pytania.add(8, new PytaniaDoTestu( "W jakim panstwie znajduja sie miasta: Nicea i Lens?"));
	
	
	
	odpowiedzi.add(1, new PytaniaDoTestu("A. Podkarpackim, B. Podlaskim, C. Swietokrzyskim, D. Mazowieckim"));
	odpowiedzi.add(2, new PytaniaDoTestu("A. Porto, B. Lizbona, C. Madryt, D. Marsylia"));
	odpowiedzi.add(3, new PytaniaDoTestu("A. Ural, B. Karpaty, C. Pireneje, D. Kaukaz"));
	odpowiedzi.add(4, new PytaniaDoTestu("A. Tak, B. Nie"));
	odpowiedzi.add(5, new PytaniaDoTestu("A. Waszyngton, B. Nowy Jork, C. Los Angeles, D. San Diego"));
	odpowiedzi.add(6, new PytaniaDoTestu("A. Adriatyckim, B. Karaibskim, C. Srodziemnym, D. Hebrydzkie"));
	odpowiedzi.add(7, new PytaniaDoTestu("A. Czarnogory, B. Chorwacji, C. Bulgarii, D. Albanii"));
	odpowiedzi.add(8, new PytaniaDoTestu("A. Belgia, B. Szwajcaria, C. Francja, D. Austria"));
	
}
}

Gdzie popelniam blad i jak mam go zlikwidowac? Prosze o wyrozumialosc, bo dopiero raczkuje ;)

0

A może ma to wspólnego coś z faktem że o ile dobrze wide to klasa której próbujesz tworzyć instancje dom. konstruktorem jego nie ma,ma tylko z parametrem ? :)

0

No nie zdefiniowałeś domyślnego konstruktora.
Zdefiniowałeś sobie konstruktor który przyjmuje jakiś argument więc domyślny nie zostanie automatycznie wygenerowany.
Musisz tam dopisać definicję konstruktora bezargumentowego.

0

dodalem domyslne konstruktory bezparametrowe i bezargumentowe w klasach PytaniaDoTestu i TestWiedzy, niby wszystko ok, a jak probuje odpalic program to wyskakuje to:

Exception in thread "main" java.lang.StackOverflowError
	at PytaniaDoTestu.<init>(PytaniaDoTestu.java:4)
	at PytaniaDoTestu.<init>(PytaniaDoTestu.java:19)
	at PytaniaDoTestu.<init>(PytaniaDoTestu.java:19) 

i ciagnie sie ten wiersz z liczba 19 przez milion linijek w dol, co znowu poknocilem? :D

0

Objawy wskazują na nieskończoną rekurencję (metoda lub konstruktor) sama się wywołuje. Szukanie błędu w tym kodzie, to mało sensowne zajęcie. Ten kod nadaje się tylko na śmietnik.
Np. z jakiego powodu klasa TestWiedzy dziedziczy po klasie PytaniaDoTestu?
Masz prosty przykład nieskończonej rekurencji:

public class Test
{
    public static void main(String[] args)
    {
        new Test();
    }
    public Test()    
    {
        infiniteRecursion();
    }
    private void infiniteRecursion()
    {
        infiniteRecursion();
    }
}
0

W PytaniaDoTestu umiescilem pytania, zeby nie wszystko bylo w jednej klasie (TestWiedzy), wiec chcialem zeby dziedziczyla po prostu informacje o pytaniach, wiem, ze nadaje sie na smietnik, po prostu chcialem poeksperymentowac, no nic.. uproszcze to i pozamieniam na Stringi tak jak bylo wczesniej :)

0

Chodzi to, że w klasie PytaniaDoTestu masz blok inicjalizacyjny, który wywołuje się przed konstruktorem. Czyli w bloku dodajesz do listy obiekt PytaniaDoTestu, tworząc go znów wywołuje się blok inicjalizacyjny itd...

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