我记得我以前在学awt的时候,遇到过一个问题,一直都没想明白,是书上的一个例题,讲的是鼠标事件,代码如下,大家可以直接拷贝运行一下更直观:import java.awt.*;
import java.awt.event.*;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
public class LineDrawer extends Frame {
  private List<List<Point>> lines=new ArrayList<List<Point>>();  //存放所有的线条
  private List<Point> currLine; //当前线条  public LineDrawer(String title){
    super(title);    addMouseListener(new MouseAdapter(){
      //当用户按下鼠标,就开始绘制一条新的线条
      public void mousePressed(MouseEvent event){
        currLine=new ArrayList<Point>();
        lines.add(currLine);
        currLine.add(new Point(event.getX(),event.getY()));
      }
    });    addMouseMotionListener(new MouseMotionAdapter(){
      //拖动鼠标时,随之画线条
      public void mouseDragged(MouseEvent event){
        currLine.add(new Point(event.getX(),event.getY()));
        repaint();
      }
    });    setSize(300,300);
    setVisible(true);
  }
  public void update(Graphics g){
     paint(g);
  }  public void paint(Graphics g){
     Iterator<List<Point>> linesIterator=lines.iterator();
     while(linesIterator.hasNext()){
       Iterator<Point> points=linesIterator.next().iterator();
       int x1=-1,y1=-1,x2=-1,y2=-1;
       while(points.hasNext()){
         Point point=points.next();
         x2=(int)point.getX();
         y2=(int)point.getY();
         if(x1!=-1)
           g.drawLine(x1,y1,x2,y2);
         x1=x2;
         y1=y2;
       }
     }
  }
  public static void main(String args[]){
    new LineDrawer("hello");
  }
}
我当时想让代码简单些,于是注释掉了几行代码,做了一处修改,是可以运行的,但是会报错:import java.awt.*;
import java.awt.event.*;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
public class LineDrawer extends Frame {
//  private List<List<Point>> lines=new ArrayList<List<Point>>();  //存放所有的线条
  private List<Point> currLine; //当前线条  public LineDrawer(String title){
    super(title);    addMouseListener(new MouseAdapter(){
      //当用户按下鼠标,就开始绘制一条新的线条
      public void mousePressed(MouseEvent event){
        currLine=new ArrayList<Point>();
 //       lines.add(currLine);
        currLine.add(new Point(event.getX(),event.getY()));
      }
    });    addMouseMotionListener(new MouseMotionAdapter(){
      //拖动鼠标时,随之画线条
      public void mouseDragged(MouseEvent event){
        currLine.add(new Point(event.getX(),event.getY()));
        repaint();
      }
    });    setSize(300,300);
    setVisible(true);
  }
  public void update(Graphics g){
     paint(g);
  }  public void paint(Graphics g){
  //   Iterator<List<Point>> linesIterator=lines.iterator();
  //   while(linesIterator.hasNext()){
       Iterator<Point> points=currLine.iterator();
       int x1=-1,y1=-1,x2=-1,y2=-1;
       while(points.hasNext()){
         Point point=points.next();
         x2=(int)point.getX();
         y2=(int)point.getY();
         if(x1!=-1)
           g.drawLine(x1,y1,x2,y2);
         x1=x2;
         y1=y2;
       }
    // }
  }
  public static void main(String args[]){
    new LineDrawer("hello");
  }
}为什么会报错呢,如果我把代码改为以下,就无法正常执行了,只能画一小段线条,难道currLine.add(new Point(event.getX(),event.getY()));无法执行了么:import java.awt.*;
import java.awt.event.*;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
public class LineDrawer extends Frame {
//  private List<List<Point>> lines=new ArrayList<List<Point>>();  //存放所有的线条
  private List<Point> currLine; //当前线条  public LineDrawer(String title){
    super(title);    addMouseListener(new MouseAdapter(){
      //当用户按下鼠标,就开始绘制一条新的线条
      public void mousePressed(MouseEvent event){
        currLine=new ArrayList<Point>();
 //       lines.add(currLine);
        currLine.add(new Point(event.getX(),event.getY()));
      }
    });    addMouseMotionListener(new MouseMotionAdapter(){
      //拖动鼠标时,随之画线条
      public void mouseDragged(MouseEvent event){
        currLine.add(new Point(event.getX(),event.getY()));
        repaint();
      }
    });    setSize(300,300);
    setVisible(true);
  }
  public void update(Graphics g){
     paint(g);
  }  public void paint(Graphics g){
  //   Iterator<List<Point>> linesIterator=lines.iterator();
  //   while(linesIterator.hasNext()){
       while(1>0){
       Iterator<Point> points=currLine.iterator();
       int x1=-1,y1=-1,x2=-1,y2=-1;
       while(points.hasNext()){
         Point point=points.next();
         x2=(int)point.getX();
         y2=(int)point.getY();
         if(x1!=-1)
           g.drawLine(x1,y1,x2,y2);
         x1=x2;
         y1=y2;
       }
     }
  }
  public static void main(String args[]){
    new LineDrawer("hello");
  }
}

解决方案 »

  1.   

    你的第一个修改的程序
    在JFrame显示初始化时,会调用paint方法但此时你的 currLine为空所以会出现空指针异常
    可以修改如下
    import java.awt.*;
    import java.awt.event.*;
    import java.util.List;
    import java.util.ArrayList;
    import java.util.Iterator;
    import javax.swing.JFrame;
    public class LineDrawer extends JFrame {
    boolean isFirst=true;
    //  private List <List <Point>> lines=new ArrayList <List <Point>>();  //存放所有的线条
      private List <Point> currLine; //当前线条  public LineDrawer(String title){
        super(title);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        addMouseListener(new MouseAdapter(){
          //当用户按下鼠标,就开始绘制一条新的线条
          public void mousePressed(MouseEvent event){
            currLine=new ArrayList <Point>();
     //       lines.add(currLine);
            currLine.add(new Point(event.getX(),event.getY()));
          }
        });    addMouseMotionListener(new MouseMotionAdapter(){
          //拖动鼠标时,随之画线条
          public void mouseDragged(MouseEvent event){
            currLine.add(new Point(event.getX(),event.getY()));
            repaint();
          }
        });    setSize(300,300);
        setVisible(true);
      }
      public void update(Graphics g){
         paint(g);
      }  public void paint(Graphics g){
       if(isFirst){
       isFirst=false;
       return;
       }

      //   Iterator <List <Point>> linesIterator=lines.iterator();
      //   while(linesIterator.hasNext()){
           Iterator <Point> points=currLine.iterator();
           int x1=-1,y1=-1,x2=-1,y2=-1;
           while(points.hasNext()){
             Point point=points.next();
             x2=(int)point.getX();
             y2=(int)point.getY();
             if(x1!=-1)
               g.drawLine(x1,y1,x2,y2);
             x1=x2;
             y1=y2;
           }
        // }
      }
      public static void main(String args[]){
        new LineDrawer("hello");
      }
      

  2.   

    你的第二个程序
    这行 while(1>0){ 
    使程序死循环
    无法从paint方法中推出
      

  3.   

    感谢,那样修改后确实没有错误了,我再问一下,在初始化中paint()方法是由于在鼠标监听器中的repaint()方法被调用产生的,但并没有产生鼠标事件啊,也被初始化了吗,那么在源程序中Iterator <List <Point>> linesIterator=lines.iterator(); while(linesIterator.hasNext()){ ...}为什么没有产生空指针异常呢
      

  4.   

    当你创建JFrame的时候就会自动调用paint方法
    所以没有鼠标事件也会被初始化
    Iterator  <List  <Point>> linesIterator=lines.iterator(); while(linesIterator.hasNext()){ ...}为什么没有产生空指针异常呢答:如果lines中没有Point那么linesIterator.hasNext()返回false
    所以什么都不作while循环结束,退出paint方法
      

  5.   

    谢谢你!我明白了,我把我改的那段代码加上private List <Point> currLine=new ArrayList <Point>(); 就可以避免错误了,非常感谢你的指点import java.awt.*; 
    import java.awt.event.*; 
    import java.util.List; 
    import java.util.ArrayList; 
    import java.util.Iterator; 
    public class LineDrawer extends Frame { 
    //  private List <List <Point>> lines=new ArrayList <List <Point>>();  //存放所有的线条 
      private List <Point> currLine[size=11px]=new ArrayList <Point>(); 
    //当前线条   public LineDrawer(String title){ 
        super(title);     addMouseListener(new MouseAdapter(){ 
          //当用户按下鼠标,就开始绘制一条新的线条 
          public void mousePressed(MouseEvent event){ 
            currLine=new ArrayList <Point>(); 
     //       lines.add(currLine); 
            currLine.add(new Point(event.getX(),event.getY())); 
          } 
        });     addMouseMotionListener(new MouseMotionAdapter(){ 
          //拖动鼠标时,随之画线条 
          public void mouseDragged(MouseEvent event){ 
            currLine.add(new Point(event.getX(),event.getY())); 
            repaint(); 
          } 
        });     setSize(300,300); 
        setVisible(true); 
      } 
      public void update(Graphics g){ 
         paint(g); 
      }   public void paint(Graphics g){ 
      //   Iterator <List <Point>> linesIterator=lines.iterator(); 
      //   while(linesIterator.hasNext()){ 
           Iterator <Point> points=currLine.iterator(); 
           int x1=-1,y1=-1,x2=-1,y2=-1; 
           while(points.hasNext()){ 
             Point point=points.next(); 
             x2=(int)point.getX(); 
             y2=(int)point.getY(); 
             if(x1!=-1) 
               g.drawLine(x1,y1,x2,y2); 
             x1=x2; 
             y1=y2; 
           } 
        // } 
      } 
      public static void main(String args[]){ 
        new LineDrawer("hello"); 
      } 

    控制台说是由于第40行代码产生空指针,也就是