如何修复空指针异常

时间:2014-05-18 19:13:30

标签: java swing user-interface jframe actionlistener

我正在尝试使用BufferedImage,JFrame和JPanel在Java中开发一个图像编辑器,但是我无法让我的按钮与我从文件中读取的BufferedImage进行交互。这是我的代码:

   import java.awt.*;
   import java.awt.Graphics;

   import java.awt.event.*;
   import javax.swing.*;
   import java.io.*;
   import javax.imageio.ImageIO;
   import java.awt.image.BufferedImage;
   import java.io.IOException;



/**
This class just holds the main
*/
    public class ImageEditorDeluxe
   {
       public static void main(String[] args)
      {
         ProgramWindow p = new ProgramWindow();
         p.setBounds(100, 100, 500, 500);
         p.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         p.setVisible(true);
        //  p.pack();
      }
   }

/**
This is where all of the JPanels will come together
*/
    class ProgramWindow extends JFrame  
   {
       ProgramWindow()
      {
         ImagePanel ip = new ImagePanel();
         ChooseFile cf = new ChooseFile();
         ButtonPanel bp = new ButtonPanel(ip.getImg());

         add(ip, BorderLayout.CENTER);
         add(cf, BorderLayout.SOUTH);
         add(bp, BorderLayout.WEST);
      }
   }

/**
This is where the image will be displayed
*/
    class ImagePanel extends JPanel
   {
      BufferedImage img;

       ImagePanel()
      {
         setBackground(Color.BLUE);  //to test
         final JButton button = new JButton ("Display picture");
         add(button);       

         ActionListener action = 
             new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
               {
                  if (e.getSource()==button)
                  {
                     try
                     {
                        img = ImageIO.read(ChooseFile.getFile());
                     }
                         catch(IOException f)
                        {
                           f.printStackTrace();
                        }

                     repaint();

                  }
               }

            };

         button.addActionListener(action);
      }

       public void paintComponent(Graphics g)
      {
         super.paintComponent(g);
         if (img != null)
            g.drawImage(img, 0, 0, this);
      }

       public void setImage(BufferedImage i)
      {
         img = i;
         repaint();
      }
        public BufferedImage getImg()
        {
            return img;
        }
   }

/**
This is where the JFileChooser will exist
*/

    class ChooseFile extends JPanel
   {
      static File file;
      JButton bOpen, bDisplay;
      BufferedImage img;


       ChooseFile()
      {
         setBackground(Color.GREEN); //to test
         bOpen = new JButton("Open File");
         add(bOpen);
      //    bDisplay = new JButton("Display File");
      //    add(bDisplay);
         final JFileChooser chooser = new JFileChooser();


         ActionListener action = 
             new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
               {
                //open file
                  if (e.getSource()==bOpen)
                  {
                     chooser.showOpenDialog(null);
                     file = chooser.getSelectedFile();
                  }
                //display file
               /*       if (e.getSource()== bDisplay)
                  {
                     try
                     {
                        img = ImageIO.read(file);
                     }
                         catch(IOException f)
                        {
                           f.printStackTrace();
                        }

                  }*/
               }

            };

         bOpen.addActionListener(action);
      //        bDisplay.addActionListener(action);
      }

    //returns String name of file
       static File getFile() throws IOException
      {
         return file;
      }
   }

    class ButtonPanel extends JPanel
   {
        JButton makeBlue;
        public static BufferedImage img;
        public static int width, height;
        //BufferedImage img;
       ButtonPanel(BufferedImage x)
      {

            img = x;
            int width, height;
         setBackground(Color.RED);
         makeBlue = new JButton("Make Blue");
         add(makeBlue);
         ActionListener action = 
             new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
               {
                        int width, height;
                  if (e.getSource()== makeBlue)
                  {
                            //img = x;
                         width = img.getWidth();
                             height = img.getHeight();
                             System.out.println(width + " " + height);
                     repaint();

                  }
               }

            };

         makeBlue.addActionListener(action);
      }
   }

错误在ButtonPanel类的某个地方,但我不确定它是什么。当我按下makeBlue按钮时,我当前得到的错误是:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at ButtonPanel$1.actionPerformed(ImageEditorDeluxe.java:185)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6505)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3320)
    at java.awt.Component.processEvent(Component.java:6270)
    at java.awt.Container.processEvent(Container.java:2229)
    at java.awt.Component.dispatchEventImpl(Component.java:4861)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    at java.awt.Container.dispatchEventImpl(Container.java:2273)
    at java.awt.Window.dispatchEventImpl(Window.java:2719)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:708)
    at java.awt.EventQueue$4.run(EventQueue.java:706)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:2)

堆栈跟踪很清楚:

  

线程中的异常" AWT-EventQueue-0"显示java.lang.NullPointerException

     

ButtonPanel $ 1.actionPerformed(ImageEditorDeluxe.java:185)

归结为这行代码:

width = img.getWidth();

在这段更大的代码中:

class ButtonPanel extends JPanel
{
    JButton makeBlue;
    public static BufferedImage img;
    public static int width, height;
    //BufferedImage img;
    ButtonPanel(BufferedImage x)
    {

        img = x;
        int width, height;
        setBackground(Color.RED);
        makeBlue = new JButton("Make Blue");
        add(makeBlue);
        ActionListener action = 
            new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    int width, height;
                    if (e.getSource()== makeBlue)
                    {
                        //img = x;
                        width = img.getWidth();
                        height = img.getHeight();
                        System.out.println(width + " " + height);
                        repaint();

                    }
                }

            };

        makeBlue.addActionListener(action);
    }
}

img看起来像null。使用调试器查找原因并相应地修复它。