import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Panel;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import javax.swing.*;

 

public class ImageCanvas extends Frame implements ActionListener {
   private Button openButton; // 버튼
   private Image image; // 이미지
   private TextField point;
   Graphics gbuf;
 
   public ImageCanvas() {
      makeUI();
   }
   // UI 구성
   private void makeUI() {
      this.setTitle("Image Canvas");
      this.setLayout(new BorderLayout());
      this.setSize(800, 800);
      this.addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent we) {
            System.exit(0);
         }
      }
      );
    
     
     
     
          
      // 이미지 불러오기 버튼
    
      Panel pnl = new Panel();
   
      point = new TextField(10);
    
      setBackground (Color.gray);
     
    
      this.addMouseListener(new MouseAdapter()
      {
          public void mouseClicked(MouseEvent e){
              point.setText("X:"+e.getX() + "Y:" + e.getY());
              int ImgRGB = ((BufferedImage) image).getRGB(e.getX(), e.getY()); // 이미지 좌표별 RGB값 추출
              int red = (ImgRGB & 0x00FF0000) >> 16;
              // 2^8으로 구성되어있는데, RGB로 구성있기 때문에 16만큼 쉬프트하면 RED
              // 8만큼 쉬프트 하면 G
              // 쉬프트를 하지 않으면 B 값을 추출할 수 있습니다.
              // [R=2^8] [B=2^8] [G]
              int green = (ImgRGB & 0x0000FF00) >> 8;
              int blue = (ImgRGB & 0x000000FF);
              point.setText("r: "+red+" ,g: "+green+" , b: "+blue);
          }

        private int getRGB(int x, int y) {
            // TODO Auto-generated method stub
            return 0;
        }
      }
      );
    
    
    //프레임에 배치
     
      openButton = new Button("Load Image");
      pnl.add(openButton);
      add(point,"North");
         
      openButton.addActionListener(this);
      this.add(pnl, BorderLayout.SOUTH);
      this.setVisible(true);
    
  
  
}
protected static int getRGB(int x, int y) {
    // TODO Auto-generated method stub
    return 0;
}
// 버튼 눌렸을 때 처리
   public void actionPerformed(ActionEvent ae) {
      if (ae.getSource() == openButton) {
         // 파일 선택 다이얼로그 생성
         FileDialog fd = new FileDialog(this);
         fd.setTitle("Select Image");
         fd.setSize(300, 100);
         fd.setVisible(true);
         // 파일 선택 후 이미지 불러오기
         loadImage(fd.getDirectory() + fd.getFile());
      }
   }
 //이미지 불러오기
   private void loadImage(String filePath) {
       //파일 다이얼로그로부터 선택된 파일 경로로 이미지 파일 생성
       Image img = Toolkit.getDefaultToolkit().getImage(filePath);
       //null이 아니면 전역 변수에 할당
       if (img != null) {
           image = img;
         
           //이미지 새로 그리기
           repaint();
       }
   }
   //그리는 메소드
   public void paint(Graphics g) {
       //이미지가 null이 아니면 이미지 그리기
       if (image != null)
           //파라미터: 이미지, X좌표, Y좌표, 이미지 관찰자(생략 가능)
           //g.drawImage(image, 0, 50, this);
           //파라미터: 이미지, X좌표, Y좌표, 이미지 가로 크기, 이미지 세로 크기, 이미지 관찰자(생략 가능)
           //this는 Frame을 상속받은 ImageCanvas 객체 자체로서

           //Frame으로부터 상속받은 가로와 세로의 크기를 알 수 있는 메소드를 사용 가능합니다.

           g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), this);
   }

   public static void main(String[] args) {
      new ImageCanvas();
    
   }
}




이걸 코딩하면 이미지를 불러오고 좌표를 나타내는거까지는 되는데 클릭했을시



Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
 at ImageCanvas$2.mouseClicked(ImageCanvas.java:60)
 at java.awt.Component.processMouseEvent(Component.java:6508)
 at java.awt.Component.processEvent(Component.java:6270)
 at java.awt.Container.processEvent(Container.java:2229)
 at java.awt.Window.processEvent(Window.java:2016)
 at java.awt.Component.dispatchEventImpl(Component.java:4861)
 at java.awt.Container.dispatchEventImpl(Container.java:2287)
 at java.awt.Window.dispatchEventImpl(Window.java:2713)
 at java.awt.Component.dispatchEvent(Component.java:4687)
 at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
 at java.awt.EventQueue.access$000(EventQueue.java:101)
 at java.awt.EventQueue$3.run(EventQueue.java:666)
 at java.awt.EventQueue$3.run(EventQueue.java:664)
 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:680)
 at java.awt.EventQueue$4.run(EventQueue.java:678)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
 at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
 at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
 at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
 at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
 at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)



이런 오류가 떠...