我记得我以前在学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");
}
}
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");
}
}
解决方案 »
- 802.11 和 TCP/IP 什么关系
- 在java中,对象一般都是在堆上创建的,那class对象呢?它也在堆上创建吗?
- 小弟自学JAVA刚开始 上CSDN来请教高手了!
- J2ME技术讨论组 群号:8207529 欢迎高手加入和指点啊 可以讨论java相关问题 主要讨论J2ME
- Java中使用ObjectInputStream,ObjectOutputStream转递网络数据问题(急呀!)
- 代码疑问
- linux下的APACHE,我找不到mime.types
- 关于JCreator Pro序列号
- 哪里有比较全的java类库和相关的方法下载?
- Java屌丝求帮忙:请高手帮忙修改一个“截图功能”的优化调用效果.
- 大家来帮忙看一下,很紧急的一个问题
- JTestArea带滚动条输出,为什么没有出现要显示的数据?
在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");
}
}
这行 while(1>0){
使程序死循环
无法从paint方法中推出
所以没有鼠标事件也会被初始化
Iterator <List <Point>> linesIterator=lines.iterator(); while(linesIterator.hasNext()){ ...}为什么没有产生空指针异常呢答:如果lines中没有Point那么linesIterator.hasNext()返回false
所以什么都不作while循环结束,退出paint方法
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行代码产生空指针,也就是