Причина использования массивов целых чисел
-
20-12-2019 - |
Вопрос
Я нашел этот код в Интернете (потому что пытаюсь создать таймер).Может кто-нибудь сказать мне, почему эти коды не выдают IndexOutOfBoundsException
.
Вот код:
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;
}
затем он визуализируется с помощью задачи таймера
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);
Почему он не выдает IndexOutOfBoundsException
.Я в замешательстве, потому что он создается со значением 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();
}
}
}
Решение
Причина этого выглядит например, исключение не генерируется, потому что код ужасен и перехватывает исключение:
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 на это:
}catch(Exception e) {
e.printStackTrace();
}
И вы увидите, что генерируется исключение.Тогда вы можете:
- А) Удалите попытку/ловушку и измените
<= 30
к< 30
. - Б) Отбросьте код, потому что это плохой пример.
Что касается блока в run
, Насколько я могу судить, счетчик никогда не меняется, поэтому он всегда равен 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;
}
.
Этот код будет через исключение indexoutOfBounds.Последний проход через петлю J равно 30, самый высокий индекс в любом массиве 29.
Если он не выбрасывает исключение, то этот код не выполняется или исключение не попадает.