Simple Java n00b help (hopefully seriously simple)

Soldato
Joined
4 Nov 2003
Posts
5,738
Location
Edinburgh
Were instructed to use eclipse for our java work, now on the uni lab comps they use 3.2 and 3.3 (but default is 3.2) i can't get 3.2, so i'm using 3.3.

Problem is I create a new project and load to simple ass java files into it, but i cannot for the life of my run it, when i KNOW it runs fine on the uni labs (3.2). I tried it on 3.3 on the lab comps today and it spat out the exact same error, about not being able to find the main class...:
"java.lang.NoClassDefFoundError: BounceMain
Exception in thread "main" "

I'll upload the two java files now, but i know they're Ok. What should i be looking out for?
Really getting to me this, becuase i need to start some real coding but if i can't rely on it to actually interpret or compile whats the point?
 
Right beansprouts uploader doesn't like java or txt files... So unfortunately you get them posted here!

BounceMain
Code:
import javax.swing.*;

/*************************************************
 * This is the main application class.
 * All it does is initialize the application,
 * and open a single window.
 * BouncePanel does all the work.
 *************************************************/

public class BounceMain {
	JFrame      mainWindow;
	BouncePanel helloPanel;
	
	// Create a new window, and put helloPanel inside it.
	public BounceMain() {
		mainWindow = new JFrame("Bouncing Ball");
		mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		helloPanel = new BouncePanel();
		mainWindow.getContentPane().add(helloPanel);
        
		mainWindow.pack();
		mainWindow.setVisible(true);
	}
    
	private static void createAndShowGUI() {
		// Make sure we have nice window decorations.
		JFrame.setDefaultLookAndFeelDecorated(false);
		// Create an actual instance of HelloBounceApp
		new BounceMain();		
	}

	public static void main(String[] args) {
		// Schedule a job for the event-dispatching thread:
		// creating and showing this application's GUI.
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				createAndShowGUI();
			}
		});
	}
}


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

public class BouncePanel extends JComponent 
                         implements ComponentListener, Runnable {
	
	final static long serialVersionUID = 0;  // kill warning
	
    // constants
    final static BasicStroke stroke = new BasicStroke(2.0f);
      
    // fields
    float xsize,ysize;  // size of window
    float xpos,ypos;    // position of ball 
    float xlen,ylen;    // size of ball
    float speed;        // distance the ball moves in each frame
    float dx,dy;        // current speed + direction of ball 
    
    int    delay;       // delay between frames in miliseconds
    Thread animThread;  // animation thread                       
                
    /*************************************************
     * Draws the ball on the screen.
     *************************************************/                                
    public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g.create();
        
        // get the current window size     
        Dimension dim = getSize();
        xsize = dim.width;
        ysize = dim.height; 
        
        // clear background to white
        g2.setPaint(Color.white);
        g2.fill(new Rectangle2D.Double(0,0,xsize,ysize));       
                
        // draw ball                 
        g2.setPaint(Color.red);
        g2.fill(new Ellipse2D.Double(xpos, ysize-ypos-ylen, xlen, ylen));
        g2.setColor(Color.black);
        g2.draw(new Ellipse2D.Double(xpos, ysize-ypos-ylen, xlen, ylen));
 
        g2.dispose();
    }
    
    // empty methods that are required by the GUI event loop
    public void componentHidden (ComponentEvent e)  { }
    public void componentMoved  (ComponentEvent e)  { }
    public void componentResized(ComponentEvent e)  { }
    public void componentShown  (ComponentEvent e)  { }
    
    /****************************************************
     * Checks to see if the ball has hit any walls.
     * Called from within run(). 
     ****************************************************/
    public void checkWalls() {
       if (xpos + xlen >= xsize) { 
           xpos = xsize - xlen;
           dx   = -dx;
       } 
       if (xpos < 0) {
           xpos = 0;
           dx   = -dx; 
       } 
       if (ypos + ylen >= ysize) {
           ypos = ysize - ylen;
           dy   = -dy;
       }             
       if (ypos < 0) {
           ypos = 0;
           dy   = -dy;
       }
    }
    
    /***********************************************************
     * This is the animation thread.  
     * The code here is what actually causes the ball to bounce.
     ***********************************************************/ 
    public void run() {
      while (true) {  // loop forever          
        // update position
        xpos += dx;
        ypos += dy;
                
        // check to see if the ball has hit any walls
        checkWalls();
            
        // sleep a bit until the next frame
        try { Thread.sleep(delay); } 
        catch (InterruptedException e) { break; }
        
        // refresh the display
        repaint();  
      }
    }
        
    /****************************************************
     * This is a constructor for the BouncePanel class.
     * It initializes all the values that the class needs
     * in order to work properly.
     ****************************************************/
    
    public BouncePanel() {
        // set values for all the variables
        xsize = 480;
        ysize = 360;
        xpos  = 240;
        ypos  = 180;
        xlen  = 60;
        ylen  = 60;
        speed = 5;
        dx    = speed;
        dy    = speed;
        delay = 10;
        
        // set up window properties
        setBackground(Color.white);
        setOpaque(true);
        setPreferredSize(new Dimension((int) xsize, (int) ysize));
        setFocusable(true);
        addComponentListener(this);
        
        // start the animation thread
        animThread = new Thread(this);
        animThread.start();
    }
}
 
You may need to tell eclipse which java file contains the main mathod in your program. The Main method looks like the following:

Code:
[B]public static void Main(String[] args) {[/B]
[I]<...body omitted...>[/I]
[B]}[/B]

Eclipse needs to know which class this method is in before it can run, I think you can specifiy it in the project properties.
 
I'm not entirely sure what you mean?

Here is a screen of how i expected (and how it seems to work on 3.2?)

eclipse screen.PNG
 
That looks like you've done it correctly, are there any compile errors in your classes?

java.lang.NoClassDefFoundError is a fairly common error and is normally related to incorrectly named files/packages or Java is incorrectly configured on the machine.

Try and run a simple HelloWorld program, this will tell you if Eclipse is running correctly:

HelloWorld.java

Code:
public class HelloWorld { 

public static void main(String[] args) {
System.out.println("Hello World!");
}

}
 
Hmmmm, ok so thats not working either, what should i be looking at that isn't eclipse then? Thats a standard eclipse download not chnaged anything, it is running on vista though does this make a difference?
 
Have you installed the latest version of the Java SDK (1.6 also called Java 6)? It sounds like the CLASSPATH isn't set correctly.
 
It's nothing major, installing the latest JDK should fix it as it seems to compile flawlessly on my machine so your program is okay.
 
Right just got back in and round to doing this, installed the JDK 6 Update 4 just to make sure, i think i may have had it anyway. No change, its still spitting out main class errors. Arg...
 
Ok goto Start > Run > cmd and then type in 'echo %CLASSPATH%' without the quotes. Post your results back here.
 
Create the HelloWorld.java like I posted before and then save it to somewhere like c:\ . Open a command prompt (Start > Run > cmd) and then browse to the java file (use cd\ to get to the root of a drive). Next type in javac HelloWorld.java and the file should be compiled into HelloWorld.class. To execute the program type java HelloWorld and you should then get some output, if this works you know at least your Java installation is okay.
 
That sounds like the PATH global isn't set correctly now, do the same as before:

Start > Run > cmd and then type in echo %PATH%

Check to see if there is a reference to the JDK bin directory which should be something like ...\jdk1.6.0_04\bin. If there isn't then you need to set it. You can set it using the following command, make sure the path to the JDK bin is the same as below as your system may be different. Issue this from a command prompt.

set PATH=%PATH%;C:\Program Files\Java\jdk1.6.0_04\bin

You can then do echo %PATH% to check that it worked.

Try and compile the java program again, it should work this time, eclipse may also start working.
 
Last edited:
Right i've totally cleaned my installations out, and installed the JDK again, it still wasn't compiling within the command prompt, but after setting the path it is compiling and running now. Although eclipse *still* isn't working... I'm beginning to lose faith here...
 
Oops sorry, my fault, I forgot that setting the variables in a command prompt is only temporary for the session. You need to go to system properties and set it (Windows Key + Pause/Break) or (Right-Click My Computer > Properties).

pathedit.jpg


Try again, see if it makes any difference to Eclipse. I highly doubt it as the error you seem to be getting is coming from the Java compiler, did your HelloWorld program generate the same error in Eclipse?
 
Last edited:
Back
Top Bottom