java的canvas

我想知道下面这段程序是为什么mycanvas=newMycanvas[21];for(inti=1;i<=20;i++){mycanvas[i]=newMycanvas(... 我想知道下面这段程序是为什么
mycanvas=new Mycanvas[21];
for(int i=1;i<=20;i++)
{ mycanvas[i]=new Mycanvas(i,i);
我明明只需要创建20个mycanvas数组,但是Mycanvas[21]有21个,我还试了一下,把21改成20,那么applet就显示小程序没启动了。如果把21改成20,那么那个i<=20也要改成19,反正就是比上面的数组少一个数,这是为什么,请大神介绍一下。另外,源程序如下
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
class Mycanvas extends Canvas
{ int x,y;
Mycanvas(int a,int b)
{ x=a;
y=b;
setSize(100,160);
}
public void paint(Graphics g)
{ g.setColor(Color.red);
g.fillOval(50,50,4*x,4*y);//画实心椭圆
g.drawString("我是第"+x,10,150);
}
}
public class Example extends Applet implements ActionListener
{ CardLayout mycard;
Button button1,button2,button3;
Mycanvas mycanvas[];
Panel p;
public void init()
{ setLayout(new BorderLayout()); //小容器的布局是边界布局.
mycard=new CardLayout();
p=new Panel();
p.setLayout(mycard); //p的布局设置为mycard 卡片式布局 .
button1=new Button("first");
button2=new Button("next");
button3=new Button("last one");
mycanvas=new Mycanvas[21];
for(int i=1;i<=20;i++)
{ mycanvas[i]=new Mycanvas(i,i);
p.add("i am"+i,mycanvas[i]);
}
button1.addActionListener(this);
button2.addActionListener(this);
button3.addActionListener(this);
Panel p2=new Panel();
p2.add(button1);
p2.add(button2);
p2.add(button3);
add(p,BorderLayout.CENTER);
add(p2,BorderLayout.SOUTH); }
public void actionPerformed(ActionEvent e)
{ if(e.getSource()==button1)
{ mycard.first(p); }
else if(e.getSource()==button2)
{ mycard.next(p); }
else if(e.getSource()==button3)
{ mycard.last(p); }
}
}
注 普通的java数组创建20个然后只能用0到19而不能用20访问我是知道的。

不过这道题是相当于创建了21个数组,因为不是mycanvas=new Mycanvas[21]吗,然后它循环时(i=1;i<=20;i++)这不就是说它只用了canvas[0]到canvas[19]这20个数组,那么最后一个数组canvas[20]不就没用到了吗,所以它按理来说应该是可以删掉改成mycanvas=new Mycanvas[20]的,可是这样就出现applet小程序未启动的问题了。所以我想知道的是为什么最后一个没有用到数组删掉就出现问题了
展开
 我来答
晶鑫森淼焱垚畾
2015-10-27 · TA获得超过1876个赞
知道小有建树答主
回答量:2361
采纳率:0%
帮助的人:683万
展开全部
JAVA数组下标从0开始的,你创建20个,那就只能用0~19这20个下标进行访问。

你要用下标20去访问,就要出现数组越界异常,程序没有捕获这个异常,主程序就直接结束了!
更多追问追答
追问
不过这道题是相当于创建了21个数组,因为mycanvas=new Mycanvas[21],然后它循环时(i=1;i<=20;i++)这不就是说它只用了canvas[0]到canvas[19]这20个数组,那么canvas[20]不就没用到了吗,所以它按理来说应该是可以删掉改成mycanvas=new Mycanvas[20]的,可是这样就出现applet小程序未启动的问题了。
追答
说了啊,你mycanvas=new Mycanvas[21],那就是长度是21的数组,

可以用mycanvas[0] , mycanvas[1],...mycanvas[20]来访问!

但是你要申请长度为20的,那么就只能访问mycanvas[0] , mycanvas[1],...mycanvas[19]

你(i=1;i<=20;i++)这样循环,当i=20的时候,mycanvas[i]就是mycanvas[20],这个时候,数组就越界了啊,程序就结束了啥。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式