Frage

Ich habe diesen Code im Internet gefunden (weil ich versuche, einen Timer zu erstellen).Kann mir jemand sagen, warum dieser Code kein Problem auslöst? IndexOutOfBoundsException.

Hier ist der Code:

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;
}

dann wird es mit einer Timer-Aufgabe gerendert

    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);    

Warum wirft es kein IndexOutOfBoundsException.Ich bin verwirrt, weil es mit einem Wert von 30 instanziiert wird und wenn ich versuche, dies auszuführen, überschreitet die Laufzeit 30, beispielsweise 100 in ms, 59 in s usw. und so weiter.

Und hier ist der vollständige Code:

 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();
    }
 }
}
War es hilfreich?

Lösung

Der Grund dafür sieht aus Dass eine Ausnahme nicht ausgelöst wird, liegt daran, dass der Code schrecklich ist und die Ausnahme abfängt:

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

Ändern Sie den Catch-Block wie folgt:

}catch(Exception e) {
    e.printStackTrace();
}

Und Sie werden sehen, dass eine Ausnahme ausgelöst wird.Dann könnten Sie entweder:

  • A) Entfernen Sie den Try/Catch und ändern Sie ihn <= 30 Zu < 30.
  • B) Verwerfen Sie den Code, da es sich um ein schlechtes Beispiel handelt.

Was den Block angeht run, soweit ich das beurteilen kann, wird count nie geändert, also ist es immer 0.

Andere Tipps

    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;
    }

Dieser Code Wille durch eine IndexOutOfBounds-Ausnahme.Der letzte Durchlauf durch die Schleife j ist 30, der höchste Index in jedem Array ist 29.

Wenn keine Ausnahme ausgelöst wird, wird dieser Code nicht ausgeführt oder die Ausnahme wird abgefangen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top