Java 整数数组背后的原因

Java 整数数组背后的原因,java,arrays,indexoutofboundsexception,Java,Arrays,Indexoutofboundsexception,我在互联网上找到了这段代码(因为我正在尝试创建一个计时器)。有人能告诉我为什么此代码不抛出索引AutofBoundsException 代码如下: hour = new int[30]; min = new int[30]; sec = new int[30]; msec = new int[30]; start = false; stop = true; for(int j = 0 ; j <= 30 ; j++) { hour[j] = 0; min[j] = 0;

我在互联网上找到了这段代码(因为我正在尝试创建一个计时器)。有人能告诉我为什么此代码不抛出
索引AutofBoundsException

代码如下:

hour = new int[30];
min = new int[30];
sec = new int[30];
msec = new int[30];
start = false;
stop = true;
for(int j = 0  ; j <= 30 ; j++)
{
    hour[j] = 0;
    min[j] = 0;
    sec[j] = 0;
    msec[j] = 0;
}
为什么它不抛出一个
索引outofboundsException
。我很困惑,因为它被实例化为值30,当我尝试运行它时,运行时间超过30,比如100毫秒,59秒等等

下面是完整的代码:

 public class TimerCan extends Canvas
{
private Timer timer;
private Midlet myMid;
private Player z;
private int habaNgString,hour[],sec[],min[],msec[],maxX,maxY,count,length,x,y;
private String runningTime;
private boolean start,stop;
public Image img;
public TimerCan(Midlet midlet)
{
    this.myMid= midlet;
    try
    {
        maxX = getWidth();
        maxY = getHeight();
        count = 0;
        hour = new int[30];
        min = new int[30];
        sec = new int[30];
        msec = new int[30];
        start = false;
        stop = true;
        for(int j = 0  ; j <= 30 ; j++)
        {
            hour[j] = 0;
            min[j] = 0;
            sec[j] = 0;
            msec[j] = 0;
        }
    }catch(Exception e)
    {}
}
public void paint(Graphics g)
{
         if(hour[count] < 10)
        {
            runningTime = "0"+String.valueOf(hour[count])+":";
        }
        else
        {
            runningTime = String.valueOf(hour[count]) + ":";  
        }
        if(min[count] < 10)
        {
            runningTime = runningTime+"0"+String.valueOf(min[count]) + ":";
        }
        else
        {
            runningTime = runningTime+String.valueOf(min[count]) + ":";
        }
        if(sec[count] < 10)
        {
            runningTime = runningTime+"0"+String.valueOf(sec[count]) + ":";
        }
        else
        {
            runningTime = runningTime + String.valueOf(sec[count]) + ":";
        }
        if(msec[count] < 10)
        {
            runningTime = runningTime+"0"+String.valueOf(msec[count]);
        }
        else
        {
            runningTime = runningTime+String.valueOf(msec[count]);
        }

    try{
         img = Image.createImage("/picture/aa.png");
    }
    catch(Exception error){
    }
    x = getWidth()/2;
    y = getHeight()/2;
    g.setColor(63,155,191);
    g.fillRect(0,0,maxX, maxY);
    g.drawImage(img, x, y, Graphics.VCENTER|Graphics.HCENTER);
    g.setColor(0,0,0) ;                                               
    g.drawString(runningTime,maxX,maxY,Graphics.TOP|Graphics.LEFT);
}
private void startTimer()
{
    TimerTask task = new TimerTask()
    {
        public void run()
        {
           msec[count]++;
            if(msec[count] == 100)
            {
                msec[count] = 0 ;
                sec[count]++;
            }
            else if(sec[count] ==60)
            {

                sec[count] = 0;
                min[count]++;
            }
            else if(min[count] == 60)
            {
                min[count] = 0;

               hour[count]++;
            }
            else if(hour[count] == 24)
            {
                hour[count] = 0;
            } 
                   repaint();
        } 
    };
    timer = new Timer();
    timer.scheduleAtFixedRate(task,10,67);           
}
protected  void keyPressed(int keyCode)
{
    if(keyCode == Canvas.KEY_NUM1)
    {
        if(start == false)
        {
            start=true;
            stop=false;
        }
        else if(stop == false)
        {
            start = false ;
            stop = true ;
            timer.cancel();
        }
        if(start==true)
        {
            startTimer();
        }
    }
    if(keyCode == Canvas.KEY_NUM2)
    {                 
        min[count]=0;
        sec[count]=0;
        msec[count]=0;       
        start = false;
        stop = true;
        timer.cancel();
        try{
        z.deallocate();
        }
        catch(Exception e){}
        repaint();
    }
    if(keyCode == Canvas.KEY_NUM3)
        {
            if(stop == false)
            {
            start = false;
            stop = true;
            timer.cancel();
            try{
                InputStream inss = getClass().getResourceAsStream("alarm.wav");
                InputStreamReader iis= new InputStreamReader(inss);  
                z = Manager.createPlayer(inss,"audio/x-wav");
                z.prefetch();
                z.setLoopCount(2);
                z.start();
                }
    catch(Exception e){
    }
            }
        }
    if(keyCode==Canvas.KEY_NUM0)
    {
        try{
        z.deallocate();
        }
        catch(Exception e){}
        myMid.exit();
    }
 }
}
公共类TimerCan扩展画布
{
私人定时器;
私密小蜂;
私人球员z;
私有整数字符串,小时[],秒[],分钟[],毫秒[],最大x,最大y,计数,长度,x,y;
私有字符串运行时;
私有布尔启动、停止;
公众形象;
公共计时器CAN(Midlet Midlet)
{
这个.myMid=midlet;
尝试
{
maxX=getWidth();
maxY=getHeight();
计数=0;
小时=新整数[30];
最小值=新整数[30];
秒=新整数[30];
msec=新整数[30];
开始=错误;
停止=真;
对于(整数j=0;j
hour=新整数[30];
最小值=新整数[30];
秒=新整数[30];
msec=新整数[30];
开始=错误;
停止=真;
对于(整数j=0;j
hour=新整数[30];
最小值=新整数[30];
秒=新整数[30];
msec=新整数[30];
开始=错误;
停止=真;
对于(int j=0;j而言,看起来没有引发异常的原因是因为代码很糟糕并捕获了异常:

try
{
    maxX = getWidth();
    maxY = getHeight();
    count = 0;
    hour = new int[30];
    min = new int[30];
    sec = new int[30];
    msec = new int[30];
    start = false;
    stop = true;
    for(int j = 0  ; j <= 30 ; j++)
    {
        hour[j] = 0;
        min[j] = 0;
        sec[j] = 0;
        msec[j] = 0;
    }
}catch(Exception e)
{} // <- catches the exception and does nothing
您将看到抛出了一个异常。然后您可以:

  • A) 删除try/catch和change
    看起来没有引发异常的原因是代码很糟糕,并且捕获了异常:

    try
    {
        maxX = getWidth();
        maxY = getHeight();
        count = 0;
        hour = new int[30];
        min = new int[30];
        sec = new int[30];
        msec = new int[30];
        start = false;
        stop = true;
        for(int j = 0  ; j <= 30 ; j++)
        {
            hour[j] = 0;
            min[j] = 0;
            sec[j] = 0;
            msec[j] = 0;
        }
    }catch(Exception e)
    {} // <- catches the exception and does nothing
    
    您将看到抛出了一个异常。然后您可以:


    • A) 删除try/catch和change
      当然,第一个代码片段会引发异常。至于其余的代码,如果没有看到其余的代码,我们就不知道了(int j=0;j如果您想学习编写好的Java代码,我建议扔掉这个示例。如果您想学习如何修复坏代码,它可能会很有用。当然,第一个代码片段确实会引发异常。至于其余的代码,如果看不到其余的代码,我们就不知道了。(什么是计数?
      )(int j=0;j如果您想学习编写好的Java代码,我建议扔掉这个示例。如果您想学习如何修复坏代码,它可能会很有用。那么如果计数始终为零,为什么我在运行这些代码时会看到递增的数?它们会递增数组中的int元素。
      someArr[someInt]++
      如果是这样的话,这些代码中for循环的目的是什么?我不知道。我自己也试着去弄清楚。据我所知,count总是0,所以他们不需要任何数组。for循环完全没有意义。它除了在上一次迭代中抛出异常之外,什么都不做。这段代码是由这样做的人编写的esn不太了解Java。请不要试图从中学习。永远不要编写
      catch(异常e){}
      。那么如果计数总是零,为什么我在运行这些代码时会看到递增的数字?它们递增数组中的int元素。
      someArr[someInt]++
      如果是这样的话,这些代码中for循环的目的是什么?我不知道。我自己也试着去弄清楚。据我所知,count总是0,所以他们不需要任何数组。for循环完全没有意义。它除了在上一次迭代中抛出异常之外,什么都不做。这段代码是由这样做的人编写的esn不太懂Java。请不要试图从中学习。永远不要编写
      catch(异常e){}
      try
      {
          maxX = getWidth();
          maxY = getHeight();
          count = 0;
          hour = new int[30];
          min = new int[30];
          sec = new int[30];
          msec = new int[30];
          start = false;
          stop = true;
          for(int j = 0  ; j <= 30 ; j++)
          {
              hour[j] = 0;
              min[j] = 0;
              sec[j] = 0;
              msec[j] = 0;
          }
      }catch(Exception e)
      {} // <- catches the exception and does nothing
      
      }catch(Exception e) {
          e.printStackTrace();
      }