Archief - [JAVA] Fout in methode verhinderd compilen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Exorikos

Legacy Member
Om snel dingen in mijn programma uit te testen en de objecten intern te bekijken bne ik terug met BlueJ aan het programmeren. Alleen weigert hij te compilen sinds ik een nieuwe methode geschreven heb. Volgens ecplise staan er nochtans geen fouten in...

Code:
import java.util.*;
import javax.swing.*;

public class Main {
    
    public static final int MAX_PLOEGEN_POULE = 4;
    
    Poule A, B, C, D;
    
    public Main(){
        maakPoules();
    }
    
    private void maakPoules(){
        A = new Poule("Poule A");
        A.addTeam(0, new Team("Spanje"));
        A.addTeam(1, new Team("Spanj"));
        A.addTeam(2, new Team("Span"));
        A.addTeam(3, new Team("Spa"));
        A.teams[0].addSpeler(0, new Speler(1, "Stijn", "Club Brugge", "28/08/1988", "M"));
        A.addWedstrijd(0, new Wedstrijd("10-Jun", "20.45", "Groep A", A.teams[0], A.teams[1], "Salzburg", 0, 2));
        B = new Poule("Poule B");
        C = new Poule("Poule C");
        D = new Poule("Poule D");
    }
    
    public void testMethode(){
        String a = A.teams[0].getSpelerString();
        System.out.println(a);
    }
    
    public void test(){
        A.getTeamString();
    }
    
    public void testtest(){
        System.out.println(A.wedstrijden[0].getWedstrijdString());
    }
    
    public static void qdsngqdlgndqfjkgdhkjfg(){
        String datum;
        String uur;
        String poulenaam;
        String aString;
        int a;
        String bString;
        int b;
        String stad;
        String saString;
        int sa;
        String sbString;
        int sb;
        
        datum = JOptionPane.showInputDialog("Geef de datum");
        
        uur = JOptionPane.showInputDialog("Geef het uur");
        
        poulenaam = JOptionPane.showInputDialog("Geef de poulenaam");

        aString = JOptionPane.showInputDialog("Geef het teamnummer van thuis");
        a = Integer.parseInt(aString);
        
        bString = JOptionPane.showInputDialog("Geef het teamnummer van uit");
        b = Integer.parseInt(bString);
        
        stad = JOptionPane.showInputDialog("Geef de stad");

        saString = JOptionPane.showInputDialog("Geef doelpunten van thuis");
        sa = Integer.parseInt(saString);
        
        sbString = JOptionPane.showInputDialog("Geef doelpunten van uit");
        sb = Integer.parseInt(sbString);

        A.addWedstrijd(1, new Wedstrijd(datum, uur, poulenaam, A.teams[a], A.teams[b], stad, sa, sb));
    }
}

Alvast bedankt om te kijken. De addWedstrijd methode werkt perfect als ik gewoon de variabelen zelf invul.

JelleSampleThis

Legacy Member
een volledige klasse zou handig zijn en de foutmelding ook

forloRn_

Legacy Member
Je methode is static maar ze maakt gebruik van een instance variable. Doe die static eens weg. Gewone variabelen beginnen trouwens met een kleine letter. En ik zou eens naar de source folder van je Eclipse-project kijken.

Exorikos

Legacy Member
Die static weghalen, maakt geen verschil. Naar wat moet ik daar juist kijken?

forloRn_

Legacy Member
Neem het van mij aan: het kan nooit compileren als die static daar staat. En als Eclipse geen foutmeldingen geeft, dan zitten die .java-bestanden niet in je build path.

Exorikos

Legacy Member
Ik bedoelde dat de static weghalen het probleem nog steeds gaf. Ik had die weggehaald uit de laatste versie, maar c/p uit de oudere versie.

eclipse geeft anders wel foutmeldingen. Hij geeft:
java.lang.NoSuchMethodError: main
Exception in thread "main"

Maar dat gaf hij voor het probleem ook al daarom dat ik naar BlueJ ben gegaan omdat ik daar meer vertrouwd mee ben.

Bij Problems staat niks, buiten dat java.util.* niet gebruikt wordt.

forloRn_

Legacy Member
Klik eens met de rechtermuisknop op het .java-bestand met je main() in, en kies dan voor Run as > Java Application.

MilM

Legacy Member
Exorikos zei:
Ik bedoelde dat de static weghalen het probleem nog steeds gaf. Ik had die weggehaald uit de laatste versie, maar c/p uit de oudere versie.

eclipse geeft anders wel foutmeldingen. Hij geeft:
java.lang.NoSuchMethodError: main
Exception in thread "main"

Maar dat gaf hij voor het probleem ook al daarom dat ik naar BlueJ ben gegaan omdat ik daar meer vertrouwd mee ben.

Bij Problems staat niks, buiten dat java.util.* niet gebruikt wordt.

Je hebt waarschijnlijk gewoon geen main methode.
Het programma moet natuurlijk weten waar te starten.

Je moet altijd minstens één main methode hebben (max 1 per klasse)

Dus je moet volgende methode toevoegen (indien conflict met uw Main constructor, kies dan een andere naam voor uw klasse)

public static void main (String[] args){
new Main();
}

Exorikos

Legacy Member
Aangezien ik hier een thread heb geopend, zal ik hier maar verder gaan.

Mijn main klasse ziet er als volgt uit:
Code:
import javax.swing.*;


public class EK {
    
    
    public Poule A, B, C, D;
    
    public EK(){
    	
    	maakPoules();
    	
    }
    
    public static void main(String[] args){
    	new EK();
    }
    
    /*
     * Methode die de poules aanmaakt.
     */
    public void maakPoules(){
        A = new Poule("Poule A");
        A.addTeam(0, new Team("Spanje"));
        A.addTeam(1, new Team("Spanj"));
        A.addTeam(2, new Team("Span"));
        A.addTeam(3, new Team("Spa"));
        A.teams[0].addSpeler(0, new Speler(1, "Stijn", "Club Brugge", "28/08/1988", "M"));
        B = new Poule("Poule B");
        C = new Poule("Poule C");
        D = new Poule("Poule D");
    }
    
    /*
     * Methode om een wedstrijd toe te voegen aan een poule via inputkaders.
     */
    public void voegWedstrijdToe(){
        String datum;
        String uur;
        String poulenaam = "Poule ";
        boolean test = false;
        String aString;
        int a = 99;
        String bString;
        int b = 99;
        String stad;
        String saString;
        int sa;
        String sbString;
        int sb;
        
        datum = JOptionPane.showInputDialog("Geef de datum");
        
        uur = JOptionPane.showInputDialog("Geef het uur");
        
        char naam;
        while(test == false){ //while-lus om poulenaam te controleren.
        naam = JOptionPane.showInputDialog("Geef de letter van de poulenaam.").charAt(0);
        switch (naam){
        case 'a':
        case 'A':
        	poulenaam += "A";
        	test = true;
        	break;
        case 'b':
        case 'B':
        	poulenaam += "B";
        	test = true;
        	break;
        case 'c':
        case 'C':
        	poulenaam += "C";
        	test = true;
        	break;
        case 'd':
        case 'D':
        	poulenaam += "D";
        	test = true;
        	break;
        default:
        	JOptionPane.showMessageDialog(null, "U kunt slechts kiezen uit A, B, C en D", "error", JOptionPane.ERROR_MESSAGE);
    		test = false;
    		break;
        }
        
        }
        
        test = false;
        while(test ==false){
        aString = JOptionPane.showInputDialog("Geef het teamnummer van thuis");
        int atest = Integer.parseInt(aString);
        if(atest > 3 || atest < 0){
        	JOptionPane.showMessageDialog(null, "Teamnummers gaan van 0 tot 3!", "Fout", JOptionPane.ERROR_MESSAGE);
        	test = false;
        } else {
        	a = atest;
        	test = true;
        }
        }
        
        test = false;
        while(test == false){
        bString = JOptionPane.showInputDialog("Geef het teamnummer van uit");
        int btest = Integer.parseInt(bString);
        if(btest > 3 || btest < 0){
        	JOptionPane.showMessageDialog(null, "Teamnummers gaan van 0 tot 3!", "Fout", JOptionPane.ERROR_MESSAGE);
        	test = false;
        } else if(btest == a){
        	JOptionPane.showMessageDialog(null, "Een team kan niet tegen zichzelf spelen. Geef een ander teamnummer", "Fout", JOptionPane.ERROR_MESSAGE);
        	test = false;
        } else{
        	b = btest;
        	test = true;
        }
        }
        
        stad = JOptionPane.showInputDialog("Geef de stad");

        saString = JOptionPane.showInputDialog("Geef doelpunten van thuis");
        sa = Integer.parseInt(saString);
        
        sbString = JOptionPane.showInputDialog("Geef doelpunten van uit");
        sb = Integer.parseInt(sbString);
        
        if(poulenaam.equals("Poule A")){
        	A.addWedstrijd(0, new Wedstrijd(datum, uur, poulenaam, A.teams[a], A.teams[b], stad, sa, sb));
        	JOptionPane.showMessageDialog(null, "Toegevoegde wedstrijd: \n" + A.wedstrijden[0].getWedstrijdString());
        } else if(poulenaam.equals("Poule B")){
        	B.addWedstrijd(0, new Wedstrijd(datum, uur, poulenaam, B.teams[a], B.teams[b], stad, sa, sb));
        	JOptionPane.showMessageDialog(null, "Toegevoegde wedstrijd: \n" + B.wedstrijden[0].getWedstrijdString());
        } else if(poulenaam.equals("Poule C")){
        	C.addWedstrijd(0, new Wedstrijd(datum, uur, poulenaam, C.teams[a], C.teams[b], stad, sa, sb));
        	JOptionPane.showMessageDialog(null, "Toegevoegde wedstrijd: \n" + C.wedstrijden[0].getWedstrijdString());
        } else if(poulenaam.equals("Poule D")){
        	D.addWedstrijd(0, new Wedstrijd(datum, uur, poulenaam, D.teams[a], D.teams[b], stad, sa, sb));
        	JOptionPane.showMessageDialog(null, "Toegevoegde wedstrijd: \n" + D.wedstrijden[0].getWedstrijdString());
        } else{
        }
    }
  
}

Het gaat hier vooral op de methode voegWedstrijdToe().

Ik maak een apparte klasse voor mijn GUI. Voorlopig is dat gewoon een frame met een enkel knopje voor de methode voegWedstrijdToe(). Blijkbaar kan ik die methode daar niet aan binden omdat "Cannot make a static reference to the non-static method voegWedstrijdToe()".

De GUI ziet er nog heel simpel uit, mar er zit waarschijnlijk wel een fout in...

Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class GUI extends JPanel implements ActionListener {
	public static final int BREEDTE = 400;
	public static final int HOOGTE = 100;
	protected JButton wedstrijdButton;
	
	public GUI(){
		wedstrijdButton = new JButton("Wedstrijd \n toevoegen");
		wedstrijdButton.setActionCommand("wedstrijd");
		wedstrijdButton.addActionListener(this);
		wedstrijdButton.setToolTipText("Voeg een wedstrijd toe.");
		
		add(wedstrijdButton);
	}
	
	public void actionPerformed(ActionEvent e){
		String actionCommand = e.getActionCommand();
		
		if(actionCommand.equals("wedstrijd")){
			EK.voegWedstrijdToe();
		}
	}
	
	public static void createAndShowGUI(){

        JFrame frame = new JFrame("Europees Kampioenschap 2008");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        GUI newContentPane = new GUI();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);

        frame.pack();
        frame.setVisible(true);

	}

}
De vraag is vrij simpel: hoe krijg ik die methode aan die knop gebonden?

Exorikos

Legacy Member
Ik kan de methode wel aanroepen als ik dat doe via een "calling object", dus een nieuw object aanmaken.
Code:
public void actionPerformed(ActionEvent e){
		String actionCommand = e.getActionCommand();
		
		if(actionCommand.equals("wedstrijd")){
			EK ek = new EK();
	        ek.voegWedstrijdToe();
		} else if(actionCommand.equals("sluiten")){
			System.exit(0);
		}
	}
Maar maakt hij dan niet elke keer ik die methode oproep een nieuw object van mijn main klasse aan, waardoor alle oude gegeven, in dit geval oude wedstrijden, verloren gaan?

MilM

Legacy Member
Exorikos zei:
Ik kan de methode wel aanroepen als ik dat doe via een "calling object", dus een nieuw object aanmaken.
Code:
public void actionPerformed(ActionEvent e){
		String actionCommand = e.getActionCommand();
		
		if(actionCommand.equals("wedstrijd")){
			EK ek = new EK();
	        ek.voegWedstrijdToe();
		} else if(actionCommand.equals("sluiten")){
			System.exit(0);
		}
	}
Maar maakt hij dan niet elke keer ik die methode oproep een nieuw object van mijn main klasse aan, waardoor alle oude gegeven, in dit geval oude wedstrijden, verloren gaan?

Die vraag staat in feite los van uw vorige.

Het is niet omdat je maar één EK object wil aanmaken, dat je daarom de parameters/methodes static zou moeten maken.

Static parameters gebruik je enkel wanneer je wil dat een variabele 'gemeenschappelijk' is voor alle objecten van deze klasse.

Indien je zoals hier niet wil dat er telkens een nieuw object aangemaakt wordt, dan moet je EK niet statisch maken, maar moet je het aanmaken buiten uw methode (bijv in een klassenobject -> private Ek ek).

Je krijgt dus:

if(actionCommand.equals("wedstrijd")){
ek.voegWedstrijdToe();
}

met Ek ek een klassenvariabele

MilM

Legacy Member
Exorikos zei:
Aangezien ik hier een thread heb geopend, zal ik hier maar verder gaan.

Mijn main klasse ziet er als volgt uit:
Code:
import javax.swing.*;


public class EK {
    
    
    public Poule A, B, C, D;
    
    public EK(){
    	
    	maakPoules();
    	
    }
    
    public static void main(String[] args){
    	new EK();
    }
    
    /*
     * Methode die de poules aanmaakt.
     */
    public void maakPoules(){
        A = new Poule("Poule A");
        A.addTeam(0, new Team("Spanje"));
        A.addTeam(1, new Team("Spanj"));
        A.addTeam(2, new Team("Span"));
        A.addTeam(3, new Team("Spa"));
        A.teams[0].addSpeler(0, new Speler(1, "Stijn", "Club Brugge", "28/08/1988", "M"));
        B = new Poule("Poule B");
        C = new Poule("Poule C");
        D = new Poule("Poule D");
    }
    
    /*
     * Methode om een wedstrijd toe te voegen aan een poule via inputkaders.
     */
    public void voegWedstrijdToe(){
        String datum;
        String uur;
        String poulenaam = "Poule ";
        boolean test = false;
        String aString;
        int a = 99;
        String bString;
        int b = 99;
        String stad;
        String saString;
        int sa;
        String sbString;
        int sb;
        
        datum = JOptionPane.showInputDialog("Geef de datum");
        
        uur = JOptionPane.showInputDialog("Geef het uur");
        
        char naam;
        while(test == false){ //while-lus om poulenaam te controleren.
        naam = JOptionPane.showInputDialog("Geef de letter van de poulenaam.").charAt(0);
        switch (naam){
        case 'a':
        case 'A':
        	poulenaam += "A";
        	test = true;
        	break;
        case 'b':
        case 'B':
        	poulenaam += "B";
        	test = true;
        	break;
        case 'c':
        case 'C':
        	poulenaam += "C";
        	test = true;
        	break;
        case 'd':
        case 'D':
        	poulenaam += "D";
        	test = true;
        	break;
        default:
        	JOptionPane.showMessageDialog(null, "U kunt slechts kiezen uit A, B, C en D", "error", JOptionPane.ERROR_MESSAGE);
    		test = false;
    		break;
        }
        
        }
        
        test = false;
        while(test ==false){
        aString = JOptionPane.showInputDialog("Geef het teamnummer van thuis");
        int atest = Integer.parseInt(aString);
        if(atest > 3 || atest < 0){
        	JOptionPane.showMessageDialog(null, "Teamnummers gaan van 0 tot 3!", "Fout", JOptionPane.ERROR_MESSAGE);
        	test = false;
        } else {
        	a = atest;
        	test = true;
        }
        }
        
        test = false;
        while(test == false){
        bString = JOptionPane.showInputDialog("Geef het teamnummer van uit");
        int btest = Integer.parseInt(bString);
        if(btest > 3 || btest < 0){
        	JOptionPane.showMessageDialog(null, "Teamnummers gaan van 0 tot 3!", "Fout", JOptionPane.ERROR_MESSAGE);
        	test = false;
        } else if(btest == a){
        	JOptionPane.showMessageDialog(null, "Een team kan niet tegen zichzelf spelen. Geef een ander teamnummer", "Fout", JOptionPane.ERROR_MESSAGE);
        	test = false;
        } else{
        	b = btest;
        	test = true;
        }
        }
        
        stad = JOptionPane.showInputDialog("Geef de stad");

        saString = JOptionPane.showInputDialog("Geef doelpunten van thuis");
        sa = Integer.parseInt(saString);
        
        sbString = JOptionPane.showInputDialog("Geef doelpunten van uit");
        sb = Integer.parseInt(sbString);
        
        if(poulenaam.equals("Poule A")){
        	A.addWedstrijd(0, new Wedstrijd(datum, uur, poulenaam, A.teams[a], A.teams[b], stad, sa, sb));
        	JOptionPane.showMessageDialog(null, "Toegevoegde wedstrijd: \n" + A.wedstrijden[0].getWedstrijdString());
        } else if(poulenaam.equals("Poule B")){
        	B.addWedstrijd(0, new Wedstrijd(datum, uur, poulenaam, B.teams[a], B.teams[b], stad, sa, sb));
        	JOptionPane.showMessageDialog(null, "Toegevoegde wedstrijd: \n" + B.wedstrijden[0].getWedstrijdString());
        } else if(poulenaam.equals("Poule C")){
        	C.addWedstrijd(0, new Wedstrijd(datum, uur, poulenaam, C.teams[a], C.teams[b], stad, sa, sb));
        	JOptionPane.showMessageDialog(null, "Toegevoegde wedstrijd: \n" + C.wedstrijden[0].getWedstrijdString());
        } else if(poulenaam.equals("Poule D")){
        	D.addWedstrijd(0, new Wedstrijd(datum, uur, poulenaam, D.teams[a], D.teams[b], stad, sa, sb));
        	JOptionPane.showMessageDialog(null, "Toegevoegde wedstrijd: \n" + D.wedstrijden[0].getWedstrijdString());
        } else{
        }
    }
  
}

Het gaat hier vooral op de methode voegWedstrijdToe().

Ik maak een apparte klasse voor mijn GUI. Voorlopig is dat gewoon een frame met een enkel knopje voor de methode voegWedstrijdToe(). Blijkbaar kan ik die methode daar niet aan binden omdat "Cannot make a static reference to the non-static method voegWedstrijdToe()".

De GUI ziet er nog heel simpel uit, mar er zit waarschijnlijk wel een fout in...

Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class GUI extends JPanel implements ActionListener {
	public static final int BREEDTE = 400;
	public static final int HOOGTE = 100;
	protected JButton wedstrijdButton;
	
	public GUI(){
		wedstrijdButton = new JButton("Wedstrijd \n toevoegen");
		wedstrijdButton.setActionCommand("wedstrijd");
		wedstrijdButton.addActionListener(this);
		wedstrijdButton.setToolTipText("Voeg een wedstrijd toe.");
		
		add(wedstrijdButton);
	}
	
	public void actionPerformed(ActionEvent e){
		String actionCommand = e.getActionCommand();
		
		if(actionCommand.equals("wedstrijd")){
			EK.voegWedstrijdToe();
		}
	}
	
	public static void createAndShowGUI(){

        JFrame frame = new JFrame("Europees Kampioenschap 2008");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        GUI newContentPane = new GUI();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);

        frame.pack();
        frame.setVisible(true);

	}

}
De vraag is vrij simpel: hoe krijg ik die methode aan die knop gebonden?

Waarom gebruik je hier opnieuw een statische methode?
Gebruik bijv. (niet getest)

(zie ook de instantie van EK dat ik als klassenvariabele aangemaakt heb)

Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class GUI extends JFrame implements ActionListener {
	public static final int BREEDTE = 400;
	public static final int HOOGTE = 100;
	protected JButton wedstrijdButton;

	private EK ek;

	public GUI(){
                super("Europees Kampioenschap 2008");
		
                ek = new EK();

                wedstrijdButton = new JButton("Wedstrijd \n toevoegen");
		wedstrijdButton.setActionCommand("wedstrijd");
		wedstrijdButton.addActionListener(this);
		wedstrijdButton.setToolTipText("Voeg een wedstrijd toe.");
		
                JPanel panel = new JPanel();
		panel.add(wedstrijdButton);

             
 
                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                this.setContentPane(panel);
                this.pack();
                this.setVisible(true);
	}
	
	public void actionPerformed(ActionEvent e){
		String actionCommand = e.getActionCommand();
		
		if(actionCommand.equals("wedstrijd")){
			ek.voegWedstrijdToe();
		}
	}
}

Exorikos

Legacy Member
Alles werkt, behalve de methode aanroepen. Hij geeft dan een nullpointerexception op de lijn
ek.voegWedstrijdToe();

Ik zie niet in waarom, aangezien deze methode, als ik ze rechtstreeks aanroep (opnieuw getest), perfect werkt. In de methode is ook niks null, aangezien ik bij het declareren van de lokale variabelen ze een waarde/String/char meegeef.

Exorikos

Legacy Member
Net getest met een if-test en ek is inderdaad null.

Ik was die vergeten te declareren als new EK() :$

[BAT] Hydra

Legacy Member
Is het wel de bedoeling dat ge voor bvp practicum gui's zit te programmeren? (of is dit iets anders?)

Exorikos

Legacy Member
[BAT] Hydra;10418992 zei:
Is het wel de bedoeling dat ge voor bvp practicum gui's zit te programmeren? (of is dit iets anders?)

Dit is inderdaad voor BVP. Bij het vorige practicum (stratego) was dat alleszins mee de bedoeling.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan