[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 304
  • Last Modified:

Does this requires exception handling?

When I run the following demo, it works fine but it produces tons of errors (see the second attachment).

Operation: It opens a blank panel. On click, it shows x,y and it remains there until another click elsewhere.

Question: Does this requires exception handling? If so, what it would be?

Thank you.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Exercise16_8Part_1 extends JFrame{

    static boolean mouseClicked;
    static String str;
    
    public Exercise16_8Part_1(){
        MovableMessagePanel p=new MovableMessagePanel("Exercise16_8 Part 1");
        setLayout(new BorderLayout());
        add(p);
    }
   
    public static void main(String[]a){
        Exercise16_8Part_1 frame=new Exercise16_8Part_1();
        frame.setTitle("Exercise16_8 Part 1 (Click to see x,y)");
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400,250);
        frame.setVisible(true);
    }
    static class MovableMessagePanel extends JPanel{
        private int x=20;
        private int y=20;
        
        public MovableMessagePanel(String s){
	
            addMouseListener(new MouseAdapter(){
                public void mouseClicked(MouseEvent e){
                    x=e.getX();
                    y=e.getY();  
                    repaint();
                    str="("+e.getX()+", "+e.getY()+")";
                }
            });

			
        }
		
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawString(str,x,y);
        }
    }
}

Open in new window

run:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: String is null
	at sun.java2d.SunGraphics2D.drawString(SunGraphics2D.java:2744)
	at Exercise16_8$MovableMessagePanel.paintComponent(Exercise16_8.java:44)
	at javax.swing.JComponent.paint(JComponent.java:1029)
	at javax.swing.JComponent.paintChildren(JComponent.java:862)
	at javax.swing.JComponent.paint(JComponent.java:1038)
	at javax.swing.JComponent.paintChildren(JComponent.java:862)
	at javax.swing.JComponent.paint(JComponent.java:1038)
	at javax.swing.JLayeredPane.paint(JLayeredPane.java:567)
	at javax.swing.JComponent.paintChildren(JComponent.java:862)
	at javax.swing.JComponent.paintToOffscreen(JComponent.java:5131)
	at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1479)
	at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1410)
	at javax.swing.RepaintManager.paint(RepaintManager.java:1224)
	at javax.swing.JComponent.paint(JComponent.java:1015)
	at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
	at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
	at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
	at java.awt.Container.paint(Container.java:1780)
	at java.awt.Window.paint(Window.java:3375)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:796)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:713)
	at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:693)
	at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
	at java.awt.EventQueue.access$000(EventQueue.java:84)
	at java.awt.EventQueue$1.run(EventQueue.java:602)
	at java.awt.EventQueue$1.run(EventQueue.java:600)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:611)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: String is null
	at sun.java2d.SunGraphics2D.drawString(SunGraphics2D.java:2744)
	at Exercise16_8$MovableMessagePanel.paintComponent(Exercise16_8.java:44)
	at javax.swing.JComponent.paint(JComponent.java:1029)
	at javax.swing.JComponent.paintChildren(JComponent.java:862)
	at javax.swing.JComponent.paint(JComponent.java:1038)
	at javax.swing.JComponent.paintChildren(JComponent.java:862)
	at javax.swing.JComponent.paint(JComponent.java:1038)
	at javax.swing.JLayeredPane.paint(JLayeredPane.java:567)
	at javax.swing.JComponent.paintChildren(JComponent.java:862)
	at javax.swing.JComponent.paintToOffscreen(JComponent.java:5131)
	at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1479)
	at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1410)
	at javax.swing.RepaintManager.paint(RepaintManager.java:1224)
	at javax.swing.JComponent.paint(JComponent.java:1015)
	at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
	at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
	at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
	at java.awt.Container.paint(Container.java:1780)
	at java.awt.Window.paint(Window.java:3375)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:796)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:713)
	at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:693)
	at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
	at java.awt.EventQueue.access$000(EventQueue.java:84)
	at java.awt.EventQueue$1.run(EventQueue.java:602)
	at java.awt.EventQueue$1.run(EventQueue.java:600)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:611)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
BUILD SUCCESSFUL (total time: 10 seconds)

Open in new window

0
Mike Eghtebas
Asked:
Mike Eghtebas
2 Solutions
 
Gurvinder Pal SinghCommented:
All you need to check if whether str is null or not.

replace line 44 by

if (str != null && str.length > 0)
{
 g.drawString(str,x,y);
}
0
 
Amitkumar PSr. ConsultantCommented:
Hi,

Please find below the updated version of your code.


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

public class Exercise16_8Part_1 extends JFrame{

    static boolean mouseClicked;
    static String str;
    
    public Exercise16_8Part_1(){
        MovableMessagePanel p=new MovableMessagePanel("Exercise16_8 Part 1");
        setLayout(new BorderLayout());
        add(p);
    }
   
    public static void main(String[]a){
        Exercise16_8Part_1 frame=new Exercise16_8Part_1();
        frame.setTitle("Exercise16_8 Part 1 (Click to see x,y)");
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400,250);
        frame.setVisible(true);
    }
    static class MovableMessagePanel extends JPanel{
        private int x=20;
        private int y=20;
        
        public MovableMessagePanel(String s){
            str = ""; // Put your value for str Variable
            addMouseListener(new MouseAdapter(){
                public void mouseClicked(MouseEvent e){
                    x=e.getX();
                    y=e.getY();  
                    repaint();
                    str="("+e.getX()+", "+e.getY()+")";
                }
            });

			
        }
		
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawString(str,x,y);
        }
    }
}

Open in new window



I've added the following line in your code.


str = ""; // Put your value for str Variable
0
 
Mike EghtebasDatabase and Application DeveloperAuthor Commented:
Thank you
0
 
rams4javaexpertCommented:

Hi,

I assume you have to handle the scenario where the str value is null to avoid Null pointer exception.
This null pointer exception will occur if any of the values str,x and y are 'null'.

Always ensure that some default values exists for str, x and y.

Directly initialize the str value as below at Line8 instead of new line

static String str = "";

Modify it accordingly as per the need.

It would be best practice to check for values before calling drawString() method.

0
 
Amitkumar PSr. ConsultantCommented:
Agreed with Expert (rams4javaexpert).

:)
0

Featured Post

VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now