Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
Bug 351071 - Misleading error message
Summary: Misleading error message
Status: RESOLVED INVALID
Alias: None
Product: JDT
Classification: Eclipse Project
Component: UI (show other bugs)
Version: 3.7   Edit
Hardware: PC Windows XP
: P3 normal (vote)
Target Milestone: ---   Edit
Assignee: JDT-UI-Inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2011-07-04 07:18 EDT by Jonathan Camilleri CLA
Modified: 2011-07-05 02:54 EDT (History)
1 user (show)

See Also:


Attachments
Source code (1.62 KB, application/octet-stream)
2011-07-04 07:18 EDT, Jonathan Camilleri CLA
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Jonathan Camilleri CLA 2011-07-04 07:18:19 EDT
Build Identifier:  M20110210-1200

Upon loading the attached project, an error message is displayed, however, since we are developing using threads, the code is valid 


Reference: Core Java Volume 2 (7th Edition)

Reproducible: Always
Comment 1 Jonathan Camilleri CLA 2011-07-04 07:18:54 EDT
Created attachment 199042 [details]
Source code
Comment 2 Dani Megert CLA 2011-07-04 07:30:10 EDT
The attached source compiles fine.
Comment 3 Jonathan Camilleri CLA 2011-07-04 08:17:00 EDT
The attachment does not have any source code, somehow, so I cannot check but I am sure to have seen an error pop up for the InterruptedException status.


/**
   @version 1.32 2004-07-27
   @author Cay Horstmann
*/

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;

/**
   Shows an animated bouncing ball.
*/
public class BounceThread
{
   public static void main(String[] args)
   {
      JFrame frame = new BounceFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
   }
}

/**
   A runnable that animates a bouncing ball.
*/
class BallRunnable implements Runnable
{
   /**
      Constructs the runnable.
      @aBall the ball to bounce
      @aPanel the component in which the ball bounces
   */
   public BallRunnable(Ball aBall, Component aComponent)
   {
      ball = aBall;
      component = aComponent;
   }

   public void run()
   {
      try
      {
         for (int i = 1; i <= STEPS; i++)
         {
            ball.move(component.getBounds());
            component.repaint();
            //Thread.sleep(DELAY);
         }
      }
      catch (InterruptedException e)
      {
		  e.printStackTrace();
      }
   }

   private Ball ball;
   private Component component;
   public static final int STEPS = 1000;
   public static final int DELAY = 5;
}

/**
   A ball that moves and bounces off the edges of a
   rectangle
*/
class Ball
{
   /**
      Moves the ball to the next position, reversing direction
      if it hits one of the edges
   */
   public void move(Rectangle2D bounds)
   {
      x += dx;
      y += dy;
      if (x < bounds.getMinX())
      {
         x = bounds.getMinX();
         dx = -dx;
      }
      if (x + XSIZE >= bounds.getMaxX())
      {
         x = bounds.getMaxX() - XSIZE;
         dx = -dx;
      }
      if (y < bounds.getMinY())
      {
         y = bounds.getMinY();
         dy = -dy;
      }
      if (y + YSIZE >= bounds.getMaxY())
      {
         y = bounds.getMaxY() - YSIZE;
         dy = -dy;
      }
   }

   /**
      Gets the shape of the ball at its current position.
   */
   public Ellipse2D getShape()
   {
      return new Ellipse2D.Double(x, y, XSIZE, YSIZE);
   }

   private static final int XSIZE = 15;
   private static final int YSIZE = 15;
   private double x = 0;
   private double y = 0;
   private double dx = 1;
   private double dy = 1;
}

/**
   The panel that draws the balls.
*/
class BallPanel extends JPanel
{
   /**
      Add a ball to the panel.
      @param b the ball to add
   */
   public void add(Ball b)
   {
      balls.add(b);
   }

   public void paintComponent(Graphics g)
   {
      super.paintComponent(g);
      Graphics2D g2 = (Graphics2D) g;
      for (Ball b : balls)
      {
         g2.fill(b.getShape());
      }
   }

   private ArrayList<Ball> balls = new ArrayList<Ball>();
}

/**
   The frame with panel and buttons.
*/
class BounceFrame extends JFrame
{
   /**
      Constructs the frame with the panel for showing the
      bouncing ball and Start and Close buttons
   */
   public BounceFrame()
   {
      setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
      setTitle("BounceThread");

      panel = new BallPanel();
      add(panel, BorderLayout.CENTER);
      JPanel buttonPanel = new JPanel();
      addButton(buttonPanel, "Start",
         new ActionListener()
         {
            public void actionPerformed(ActionEvent event)
            {
               addBall();
            }
         });

      addButton(buttonPanel, "Close",
         new ActionListener()
         {
            public void actionPerformed(ActionEvent event)
            {
               System.exit(0);
            }
         });
      add(buttonPanel, BorderLayout.SOUTH);
   }

   /**
      Adds a button to a container.
      @param c the container
      @param title the button title
      @param listener the action listener for the button
   */
   public void addButton(Container c, String title, ActionListener listener)
   {
      JButton button = new JButton(title);
      c.add(button);
      button.addActionListener(listener);
   }

   /**
      Adds a bouncing ball to the canvas and starts a thread
      to make it bounce
   */
   public void addBall()
   {
      Ball b = new Ball();
      panel.add(b);
      Runnable r = new BallRunnable(b, panel);
      Thread t = new Thread(r);
      t.start();
   }

   private BallPanel panel;
   public static final int DEFAULT_WIDTH = 450;
   public static final int DEFAULT_HEIGHT = 350;
   public static final int STEPS = 1000;
   public static final int DELAY = 3;
}
Comment 4 Dani Megert CLA 2011-07-04 08:34:54 EDT
The error which is reported for the source from comment 3 is expected.
Comment 5 Jonathan Camilleri CLA 2011-07-04 10:43:12 EDT
(In reply to comment #4)
> The error which is reported for the source from comment 3 is expected.

Well, the first time I created the Java project, it read that the InterruptedException was inapppropriate, and, suggested refactoring code which is not exactly what the "book" requires.

Now, upon pasting the code, the IDE intuitively reads: Unreachable catch block for InterruptedException..., which I am ignoring for the time being.
Comment 6 Dani Megert CLA 2011-07-04 10:46:32 EDT
> Now, upon pasting the code, the IDE intuitively reads: Unreachable catch block
> for InterruptedException..., which I am ignoring for the time being.

Ignoring it is not an option. You will not be able to run your code with this error.
Comment 7 Jonathan Camilleri CLA 2011-07-04 10:52:03 EDT
(In reply to comment #6)
> > Now, upon pasting the code, the IDE intuitively reads: Unreachable catch block
> > for InterruptedException..., which I am ignoring for the time being.
> 
> Ignoring it is not an option. You will not be able to run your code with this
> error.

Sorry about that, I think you would need to look into the intermittent pattern of exceptions that might be valid, which of these make the code acceptable for compiling, and, which are not.  According to the Horstmann and Cornell this is valid code.  

I scooped this code up from Core Java Volume 2 (7th Ed) ISBN 0-13-111826-9, Chapter 1.  There is an 8th Edition (http://www.amazon.co.uk/Core-Java-II--Advanced-Features-ebook/dp/B0013A1J6U/ref=sr_1_2?ie=UTF8&qid=1309791098&sr=8-2) as well afaik.
Comment 8 Jonathan Camilleri CLA 2011-07-04 10:55:03 EDT
However, having said all this, Core Java Volume 2 (7th Edition) was written for Java JDK 1.5, whilst the latest version is JDK 1.6, expected 1.7, as you might know.  I am only a student.
Comment 9 Dani Megert CLA 2011-07-04 10:58:36 EDT
(In reply to comment #8)
> However, having said all this, Core Java Volume 2 (7th Edition) was written for
> Java JDK 1.5, whilst the latest version is JDK 1.6, expected 1.7, as you might
> know.  I am only a student.

It doesn't matter whether it's 1.4, 1.5 or whatever: the InterruptedException is a checked exception and hence the code is invalid and will not run. It's not Horstmann and Cornell who define what's valid Java code but the JLS.
Comment 10 Jonathan Camilleri CLA 2011-07-04 11:06:48 EDT
(In reply to comment #9)
> (In reply to comment #8)
> > However, having said all this, Core Java Volume 2 (7th Edition) was written for
> > Java JDK 1.5, whilst the latest version is JDK 1.6, expected 1.7, as you might
> > know.  I am only a student.
> 
> It doesn't matter whether it's 1.4, 1.5 or whatever: the InterruptedException
> is a checked exception and hence the code is invalid and will not run. It's not
> Horstmann and Cornell who define what's valid Java code but the JLS.

Noted
Comment 11 Jonathan Camilleri CLA 2011-07-04 11:11:41 EDT
(In reply to comment #10)
> (In reply to comment #9)
> > (In reply to comment #8)
> > > However, having said all this, Core Java Volume 2 (7th Edition) was written for
> > > Java JDK 1.5, whilst the latest version is JDK 1.6, expected 1.7, as you might
> > > know.  I am only a student.
> > 
> > It doesn't matter whether it's 1.4, 1.5 or whatever: the InterruptedException
> > is a checked exception and hence the code is invalid and will not run. It's not
> > Horstmann and Cornell who define what's valid Java code but the JLS.
> 
> Noted

Any idea which part of the JLS(http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html), so I ask Horstmann about it?
Comment 12 Dani Megert CLA 2011-07-04 11:17:04 EDT
> Any idea which part of the
> JLS(http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html), so I ask
> Horstmann about it?
I guess you can figure this out yourself ;-)
Comment 13 Jonathan Camilleri CLA 2011-07-04 11:18:50 EDT
(In reply to comment #12)
> > Any idea which part of the
> > JLS(http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html), so I ask
> > Horstmann about it?
> I guess you can figure this out yourself ;-)

11.2.3 discusses Exception checking (http://java.sun.com/docs/books/jls/third_edition/html/exceptions.html#11.2.3)
Comment 14 Jonathan Camilleri CLA 2011-07-04 14:01:05 EDT
(In reply to comment #12)
> > Any idea which part of the
> > JLS(http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html), so I ask
> > Horstmann about it?
> I guess you can figure this out yourself ;-)

Well, I have had another look at the source code, and, the "suggestion" by Eclipse IDE seem quite unsafe:

1. Remove catch clause - code compiles but the component does not paint the graphics as expected:
public void run()
{
   for (int i = 1; i <= STEPS; i++)
  {
     ball.move(component.getBounds());
     component.repaint();
     //Thread.sleep(DELAY);
  }
}



2. Replace catch clause with throws - code does not compile

The code does not compile in both cases, and, the developer is left with an unresolved code snippet to run, for this particular code.

public void run()
{
   try
   {
      for (int i = 1; i <= STEPS; i++)
      {
         ball.move(component.getBounds());
         component.repaint();
         //Thread.sleep(DELAY);
      }
   }
   catch (InterruptedException e)
   {
		  e.printStackTrace();
   }
}

I'm not expecting Eclipse to resolve all my problems of course, just pointing out my observations.
Comment 15 Dani Megert CLA 2011-07-05 02:36:09 EDT
The message is not misleading and hence this bug is INVALID. If you think that a certain quick fix is not working, then please file one bug report for each quick fix that you think does not work.
Comment 16 Jonathan Camilleri CLA 2011-07-05 02:54:37 EDT
(In reply to comment #15)
> The message is not misleading and hence this bug is INVALID. If you think that
> a certain quick fix is not working, then please file one bug report for each
> quick fix that you think does not work.

No problem, I think I have exhausted my feedback.