Toon posts:

[JAVA] geen public constructor volgens compiler

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

ik ben bezig een java programma te schrijven wat een xml file inleest en de waarden in een array opslaat.
Nu heb ik het grootste gedeelte klaar, maar kom ik een fout tegen.
"The applet HoofdApplet does not have a public constructor HoofdApplet()" volgens de compiler.

Ik gebruik het DOM principe om de file uit te lezen.
De fout zit hem in regel 28, maar weet iemand waarom dit fout is?
Ik ben erachter gekomen door een System.out.println("test"); af te drukken, daardoor heb ik ontdekt dat boven regel 28 hij eerst test print en dan de foutmelding en na die bewuste regel eerst de foutmelding en dan pas test.
Ik heb al de public static void main(String[] args), proberen te verwijderen, maar dan krijg ik nog meer foutmeldingen.
Hier is het stukje code waar de fout volgens mij inzit.:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.io.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import org.xml.sax.*;

public class HoofdApplet extends Applet {
  private final String fileName = "Uitslagen.xml";
  private Document document;
  public Team[] clubs;

  public HoofdApplet(){
    verwerk();}

  public static void main(String[] args){
    System.out.println("test");
    HoofdApplet maakStanden = new HoofdApplet();
    maakStanden.verwerk();
  }

  private void verwerk(){
    try{
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      factory.setValidating(true);
      DocumentBuilder builder = factory.newDocumentBuilder();
      document = builder.parse(new File(fileName)); //hier zit de fout.
    }
    //hier is nog code voor het afhandelen van enkele foutmeldingen.
    inlezen();
  }

  private void inlezen(){
    //hier gebeurt het echte inlezen, volgens mij niet relevant.
  }

Indien ik code heb weggelaten die misschien wel relevant is, dan zal ik dat zo snel mogelijk toevoegen na dat ik er bericht van heb gehad.

Kan iemand mij helpen de fout op te lossen? Want ik wordt er gek van. |:(

  • Casteloni
  • Registratie: November 2001
  • Laatst online: 10-05 21:35
Haal je static void main methode eens weg? Dit hoort sowieso niet in een applet thuis.

Verwijderd

Topicstarter
Oke, nu die verwijderd is, blijven de problemen bestaan.
Maar ik heb wel minder tekst om problemen in te vinden.

Ik ben erachter gekomen dat de fout zich in de functie inlezen bevindt.
Helaas weet ik nog niet precies waar.
Ik denk dat ik dat stukje code maar even overnieuw moet schrijven.
Wat mij betreft is dit hoofdstuk nu wel gesloten.

[ Voor 60% gewijzigd door Verwijderd op 15-01-2005 12:06 . Reden: typo ]


  • Casteloni
  • Registratie: November 2001
  • Laatst online: 10-05 21:35
Ik heb hier geen compiler om te contoleren, maar moest een applet niet een public void init() methode hebben? Deze wordt volgens mij automatisch aangeroepen als je het applet runt.

Dan is die constructor en public static void main ook overbodig ( die heeft namelijk wel de constructor nodig ).

  • Scorpion
  • Registratie: April 2000
  • Laatst online: 18-01-2024

Scorpion

not to lame to read BitchX.doc

code:
1
2
3
4
5
6
7
8
  public HoofdApplet(){
    verwerk();}

  public static void main(String[] args){
    System.out.println("test");
    HoofdApplet maakStanden = new HoofdApplet();
    maakStanden.verwerk();
  }


Als je deze java code runt als applicatie dan voert hij "verwerk();" 2x uit. 1x bij het aanmaken van de class ( = new HoofdApplet(); ) en daarna roep je em zelf nog een x aan.

Als je em als applet wilt runnen heb je zoals hierboven al genoemd was de main niet eens nodig.

Verwijderd

Topicstarter
Het probleem ligt het bij iets anders.
Ik maak een array aan, op de volgende manier:
Java:
1
2
3
4
5
6
7
8
9
public class HoofdApplet extends Applet {
  private final String fileName = "Uitslagen.xml";
  private Document document;
  private int aantalTeams = 0;
  public Team clubs[];

  public HoofdApplet(){
    clubs = new Team[25];
    verwerk();}


En op de volgende manier probeer ik gegevens erin te zetten:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    boolean bThuis = false;
    boolean bUit = false;
if (aantalTeams>0){
      for(int a = 0; a < aantalTeams; a++){
        String teamNaam = clubs[a].getNaam();
        if(thuis.equals(teamNaam))
          bThuis = true;
        if(uit.equals(teamNaam))
          bUit = true;
      }
    }
    System.out.print("test"+clubs.length);
    if(bThuis == false){
      aantalTeams++;
      clubs[aantalTeams].setNaam(thuis);
    }
    if(bUit == false){
      aantalTeams++;
      clubs[aantalTeams].setNaam(uit);
    }

En op deze manier van gegevens inzetten gaat het fout.

Zoals jullie misschien wel doorhebben is Team een klasse met enkele functies, zoals setNaam en getNaam.
Is er een andere manier om toch aan het begin 25 teams te declareren en later gegevens toe te voegen?
Of wat misschien nog mooier is, is de array groter maken zodra er een nieuw team is.

Als ik alles waarbij ik de array clubs[] gebruik uitschakel, gaat hij wel gewoon door alle lusjes heen, maar dat is eigenlijk niet mijn bedoeling.

  • Scorpion
  • Registratie: April 2000
  • Laatst online: 18-01-2024

Scorpion

not to lame to read BitchX.doc

Dynamische array's heb je niet in java. Je zou bijvoorbeeld kunnen kiezen voor een Vector (http://java.sun.com/j2se/1.3/docs/api/java/util/Vector.html)

Eventueel kun je met System.arraycopy zelf een soort dynamische array maken, maar voor het gemak zou ik in jou geval gewoon voor Vector kiezen.

Verwijderd

Topicstarter
Scorpion schreef op zaterdag 15 januari 2005 @ 13:55:
Dynamische array's heb je niet in java. Je zou bijvoorbeeld kunnen kiezen voor een Vector (http://java.sun.com/j2se/1.3/docs/api/java/util/Vector.html)

Eventueel kun je met System.arraycopy zelf een soort dynamische array maken, maar voor het gemak zou ik in jou geval gewoon voor Vector kiezen.
Dus ik kan niet een array met klassen maken en die later aanpassen volgens jouw?
Met een vektor is dus precies hetzelfde mogelijk als met een array?
Ik heb altijd gedacht dat je gewoon de klassen "in een array" kunt stoppen om ze zo later met een for-lusje er weer uit te halen.

  • momania
  • Registratie: Mei 2000
  • Laatst online: 15-05 21:29

momania

iPhone 30! Bam!

Beter pak je dan een LinkedList of een ArrayList, afhankelijk van de grootte, maar dat is allemaal wel na te lezen in de documatie over het 'Collection framework'
Dan kan je ook gewoon met een Iterator je array/list doorlopen ipv met een for lusje.

Verder:
Heb je nou al je compiler errors al weg?
Moet je bij een applet wel echt een contructor hebben? Ik meen dat je daar juist een "public void init()" moest hebben, dat is zeg maard constructor van een Applet. :)

Neem je whisky mee, is het te weinig... *zucht*


Verwijderd

Topicstarter
momania schreef op zaterdag 15 januari 2005 @ 14:08:
Beter pak je dan een LinkedList of een ArrayList, afhankelijk van de grootte, maar dat is allemaal wel na te lezen in de documatie over het 'Collection framework'
Dan kan je ook gewoon met een Iterator je array/list doorlopen ipv met een for lusje.

Verder:
Heb je nou al je compiler errors al weg?
Moet je bij een applet wel echt een contructor hebben? Ik meen dat je daar juist een "public void init()" moest hebben, dat is zeg maard constructor van een Applet. :)
Nu worden mij allemaal termen om de oren gegooid, vektor, linkedList, ArrayList :?
Ik zal me er even in verdiepen.

Maar als ik alle clubs[] array onderdelen weglaat, zoals clubs[aantalTeams].getNaam(), dan krijg ik geen compilerfouten meer en loopt hij het juiste aantal maal door het lusje heen.

Ook heb je geen "public void init()" nodig, gewoon de public constructor() is genoeg.

Dus ik moet nu nog iets anders vinden voor het opslaan van die klassen.
Bedankt allemaal, ik zal me erin verdiepen B)

[ Voor 6% gewijzigd door Verwijderd op 15-01-2005 14:19 ]


Verwijderd

Topicstarter
Ik heb het gevoel dat ik al aardig op weg ben met de vectors.
Het invoegen doe ik zo: clubs.add(aantalTeams, (new Team() ) );

Maar hoe kan ik deze regel:
clubs[aantalTeams].setNaam(uit);
vervangen?
De vector heet nog steeds clubs, en de index is aantalTeams, en setNaam(String) is een functie van de klasse Team.

  • Casteloni
  • Registratie: November 2001
  • Laatst online: 10-05 21:35
Door bij het instantieren ( == aanmaken ) van het Team object een String ( de team naam ) mee te geven:
code:
1
clubs.add(aantalTeams, (new Team("Naam van het team") ) );


Je constructor van team wordt dus public Team(String teamnaam){ //doe hier iets met die waarde }

Verwijderd

Topicstarter
VampireSlayer schreef op zaterdag 15 januari 2005 @ 15:10:
Door bij het instantieren ( == aanmaken ) van het Team object een String ( de team naam ) mee te geven:
code:
1
clubs.add(aantalTeams, (new Team("Naam van het team") ) );


Je constructor van team wordt dus public Team(String teamnaam){ //doe hier iets met die waarde }
Dit werkt inderdaad voor de naam wel, maar ik heb ook nog enkele set-functies waar ik later pas informatie aan wil toevoegen, omdat er eerst een berekening moet worden gedaan.
Of omdat er later nieuwe gegevens van een team voor komen. Als een team bijvoorbeeld 2 maal in de xml voorkomt, dan moeten de gegevens van beide keren in dezelfde "klasse" worden opgeslagen.
Daarom wil ik graag weten hoe ik dus na het aanmaken nog functies kan aanroepen met de variabele aantalTeams.

  • Casteloni
  • Registratie: November 2001
  • Laatst online: 10-05 21:35
Ik zal niet alle code voorkauwen, maar een paar tips geven:

Je team-object bevind zich in die Vector op een bepaalde index.
Je team-object heeft getters / setters.
Wat je dus moet doen, is je team-object uit de vector halen en vervolgens een set-methode aanroepen.

Verwijderd

Topicstarter
Bedankt, het is nu gelukt.
Voor de zoekresultaten:
Java:
1
2
Team tijdelijk = (Team)clubs.get(waarde);
String teamNaam = tijdelijk.getNaam();

Waar bij de laatste zin natuurlijk door van alles kan worden vervangen, zoals een set-methode, of andere uitleeswaarden.

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 11:36
Ik kan je trouwens van harte JDOM aanraden als je met XML wilt gaan spelen.
Dit maakt het werken met XML vele malen makkelijker.

Als je trouwens nog steeds foutmeldingen krijgt bij het parsen van de XML file moet je setValidating op false zetten. Tenzij je natuurlijk netjes volgens XML standaarden werkt en er zeker van bent dat je daar aan voldoet. In dit geval houdt validatie volgens mij alleen DTD validatie in, maar daar ben ik niet 100% zeker van.
Pagina: 1