Debuggen in java

Status
Niet open voor verdere reacties.

Clemens Schalkw

Gebruiker
Lid geworden
5 dec 2007
Berichten
166
Kan iemand mij tips geven voor het debuggen in Java.
Ik ken verschillende functies en manieren van debuggen in php, maar met Java ben ik nog lang niet zover.

Ik zet hier de code en foutmeldingen neer, misschien is het probleem kleiner dan ik dacht en zien jullie het zo.

Foutmeldingen:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11
at BeatBox.buildGUI(BeatBox.java:56)
at BeatBox.main(BeatBox.java:25)



Code:
import java.awt.*;
import javax.swing.*;
import javax.sound.midi.*;
import java.util.*;
import java.awt.event.*;

public class BeatBox {

	JPanel mainPanel;
	ArrayList<JCheckBox> checkboxList;
	Sequencer sequencer;
	Sequence sequence;
	Track track;
	JFrame theFrame;
	
	String[] instrumentNames = {
			"Bass Drum", "Closed Hi-Hat", "Open Hi-Hat", "Acoustic Snare", "Crash Cymbal",
			"Hand Clap", "Cowbell", "Vibraslap", "Low-mid Tom", "High-Agogo", "Open Hi Conga"
	};
	int[] instruments = {
			35, 42, 46, 38, 49, 39, 50, 60, 70, 72, 64, 56, 58, 47, 67, 63
	};

	public static void main(String[] args) {
		new BeatBox().buildGUI();
	}
	
	public void buildGUI() {
		theFrame = new JFrame("Cyber BeatBox");
		theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		BorderLayout layout = new BorderLayout();
		JPanel background = new JPanel(layout);
		background.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
		
		checkboxList = new ArrayList<JCheckBox>();
		Box buttonBox = new Box(BoxLayout.Y_AXIS);
		
		JButton start = new JButton("Start");
		start.addActionListener(new MyStartListener());
		buttonBox.add(start);
		
		JButton stop = new JButton("Stop");
		stop.addActionListener(new MyStopListener());
		buttonBox.add(stop);
		
		JButton upTempo = new JButton("Tempo Up");
		upTempo.addActionListener(new MyUpTempoListener());
		buttonBox.add(upTempo);
		
		JButton downTempo = new JButton("Tempo Down");
		downTempo.addActionListener(new MyDownTempoListener());
		buttonBox.add(downTempo);
		
		Box nameBox = new Box(BoxLayout.Y_AXIS);
		for (int i = 0; i < 16; i++) {
			nameBox.add(new Label(instrumentNames[i]));
		}
		
		background.add(BorderLayout.EAST, buttonBox);
		background.add(BorderLayout.WEST, nameBox);
		
		theFrame.getContentPane().add(background);
		
		GridLayout grid = new GridLayout(16, 16);
		grid.setVgap(1);
		grid.setHgap(2);
		mainPanel = new JPanel(grid);
		background.add(BorderLayout.CENTER, mainPanel);
		
		for (int i = 0; i < 256; i++) {
			JCheckBox c = new JCheckBox();
			c.setSelected(false);
			checkboxList.add(c);
			mainPanel.add(c);
		}
		
		setUpMidi();
		
		theFrame.setBounds(50, 50, 300, 300);
		theFrame.pack();
		theFrame.setVisible(true);
	}
	
	public void setUpMidi() {
		try {
			sequencer = MidiSystem.getSequencer();
			sequencer.open();
			sequence = new Sequence(Sequence.PPQ, 4);
			track = sequence.createTrack();
			sequencer.setTempoInBPM(120);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void buildTrackAndStart() {
		int[] trackList = null;
		
		sequence.deleteTrack(track);
		track = sequence.createTrack();
		
		for (int i = 0; i < 16; i++) {
			trackList = new int[16];
			
			int key = instruments[i];
			
			for (int j = 0; j < 16; j++) {
				JCheckBox jc = (JCheckBox) checkboxList.get(j + (16*i));
				if (jc.isSelected()) {
					trackList[j] = key;
				} else {
					trackList[j] = 0;
				}
			}
			
			makeTracks(trackList);
			track.add(makeEvent(176, 1, 127, 0, 16));
		}
		
		track.add(makeEvent(192, 9, 1, 0, 15));
		try {
			sequencer.setSequence(sequence);
			sequencer.setLoopCount(sequencer.LOOP_CONTINUOUSLY);
			sequencer.start();
			sequencer.setTempoInMPQ(120);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public class MyStartListener implements ActionListener {
		public void actionPerformed(ActionEvent a) {
			buildTrackAndStart();
		}
	}
	
	public class MyStopListener implements ActionListener {
		public void actionPerformed(ActionEvent a) {
			sequencer.stop();
		}
	}
	
	public class MyUpTempoListener implements ActionListener {
		public void actionPerformed(ActionEvent a) {
			float tempoFactor = sequencer.getTempoFactor();
			sequencer.setTempoFactor((float) (tempoFactor * 1.03));
		}
	}
	
	public class MyDownTempoListener implements ActionListener {
		public void actionPerformed(ActionEvent a) {
			float tempoFactor = sequencer.getTempoFactor();
			sequencer.setTempoFactor((float) (tempoFactor * .97));
		}
	}
	
	public void makeTracks(int[] list) {
		for (int i = 0; i < 16; i++) {
			int key = list[i];
			
			if (key != 0) {
				track.add(makeEvent(144, 9, key, 100, i));
				track.add(makeEvent(128, 9, key, 100, i+1));
			}
		}
	}
	
	public MidiEvent makeEvent(int comd, int chan, int one, int two, int tick) {
		MidiEvent event = null;
		try {
			ShortMessage a = new ShortMessage();
			a.setMessage(comd, chan, one, two);
			event = new MidiEvent(a, tick);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return event;
	}
}
 
Even over je code heengekeken en wat ik er zo snel in kan vinden:

Code:
for (int i = 0; i < 16; i++) {
			trackList = new int[16];
			
			int key = instruments[i];
			
			for (int j = 0; j < 16; j++) {
				JCheckBox jc = (JCheckBox) checkboxList.get(j + (16*i));
				if (jc.isSelected()) {
					trackList[j] = key;
				} else {
					trackList[j] = 0;
				}
			}

je hebt een array die 16 lang is.
Je gaat nu van 0 tot 16 oftewijl 17 stappen.
Daarom krijg je hier een OOB exception

Code:
public void makeTracks(int[] list) {
		for (int i = 0; i < 16; i++) {
			int key = list[i];
			
			if (key != 0) {
				track.add(makeEvent(144, 9, key, 100, i));
				track.add(makeEvent(128, 9, key, 100, i+1));
			}
		}
	}

Bij deze zo te zien hetzelfde.



Welke programma gebruik je om je code in te schrijven?
Vaak kan je "breakpoints" voor een regel zetten. Als je dan gaat debuggen, dan doorloopt hij de code vanaf daar als jij dat aangeeft met een "step into" of een "step over".
Step into is om de functie waar de regel nu bij is ook nog volledig te volgen.
Step over is de functie uitvoeren en meteen verdergaan met de volgende regel.
 
Laatst bewerkt:
je hebt een array die 16 lang is.
Je gaat nu van 0 tot 16 oftewijl 17 stappen.
Daarom krijg je hier een OOB exception

Bij het stukje i < 16 maak je toch 16 stappen? 16 telt toch niet mee als je zoekt naar kleiner dan 16?

Welke programma gebruik je om je code in te schrijven?
Ik gebruik eclipse.
Ik zie wel iets staan over Breakpoints, maar snap niet zo goed hoe het werkt.
Ik ga wel ff zoeken of ik iets van een handleiding kan vinden.

Thnx.
 
hmmz.. ja. hij zou wel 16 moeten doen... ben niet al te wakker :p
Andere OOB mogelijkheden kon ik zo niet vinden.. :)
 
Hier gaat het fout:
Code:
		Box nameBox = new Box(BoxLayout.Y_AXIS);
		for (int i = 0; i < 16; i++) {
			nameBox.add(new Label(instrumentNames[i]));
		}
De array instrumentNames bevat maar 11 elementen, het gaat fout zodra i de waarde 11 bereikt. In plaats van de hardcoded waarde 16 zou je instrumentNames.lenght kunnen gebruiken.
(Gedebugged in jDeveloper..)
 
Hee top,
Dit was het inderdaad.
Ik had bij de instrumentnamen te weinig ingevoerd, de insrumenten zelf kloppen wel.
De tip om ArrayList.length() te gebruiken is inderdaad zo en zo een hele goeie.
Bedankt.
 
Ik weet niet of je het antwoord op de breakpoints al hebt gevonden, maar je kunt op een regel gaan staan, en er een breakpoint in zetten ( CTRL + SHIFT + B ). Ipv run kun je debuggen. Als het goed is vraagt het programma of je over wil schakelen naar debug mode. Druk op ja, en het programma gaat draaien. Hij stopt als hij een breakpoint tegen komt. Boven de code staat een play button waarmee je het programma kunt hervatten.

Succes!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan