import java.awt.*;
import java.awt.event.*;
import java.util.*;public class MyMouseAdapter {
public static void main(String[] args) {
new MyFrame().runFrame();
}
}class MyFrame extends Frame {
ArrayList points = null;

public void runFrame() {
setBounds(300, 300, 800, 600);
setBackground(Color.BLUE);
points = new ArrayList();
setLayout(null);
setVisible(true);
addMouseListener(new MyMonitor());
}

public void paint(Graphics g) {
Iterator i = points.iterator();
while(i.hasNext()) {
Point p = (Point)i.next();
g.setColor(Color.YELLOW);
g.fillOval(p.x, p.y, 10, 10);
}
}

public void addPoint(Point p) {
points.add(p);
}
}class MyMonitor extends MouseAdapter {
public void mousePressed(MouseEvent e) {
MyFrame f = new MyFrame();             //如果我这样写,运行时就会出现异常,而下面注掉的不会
//MyFrame f = (MyFrame)e.getSource();  
f.addPoint(new Point(e.getX(), e.getY()));
f.repaint();
}
}
   我的理解是在鼠标点击的时候我主要是要把当前鼠标所在的位置传给f.addPoint()这个方法,从而在paint方法中进行绘圆,那么在我用MyFrame f = new MyFrame();这种写法时,e.getX(),e.getY(),都能获取当前鼠标的值,但是一运行的时候就会出现异常,如下:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at MyFrame.addPoint(MyMouseAdapter.java:33)
        at MyMonitor.mousePressed(MyMouseAdapter.java:43)
        at java.awt.Component.processMouseEvent(Component.java:6035)
        at java.awt.Component.processEvent(Component.java:5803)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Window.processEvent(Window.java:1787)
        at java.awt.Component.dispatchEventImpl(Component.java:4410)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Window.dispatchEventImpl(Window.java:2429)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre
ad.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.
java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
  
   但当我用MyFrame f = (MyFrame)e.getSource();方法写时就是正确的,我想知道为什么?