import java.awt.Image;
import java.util.ArrayList;
public class Animation{

private ArrayList <OneScene> scenes;
private int sceneIndex;
private long movieTime;
private long totalTime;

public Animation(){
scenes = new ArrayList<OneScene>();
totalTime = 0;
start();
}

public synchronized void addScene(Image i, long t){
totalTime
totalTime += t;
scenes.add(new OneScene(i, totalTime));
}

public synchronized void start(){
movieTime = 0;
sceneIndex = 0;
}

public synchronized void update(long timePassed){
if(scenes.size() > 1){
movieTime += timePassed;
if (movieTime >= totalTime){
movieTime = 0;
sceneIndex = 0;
}
while(movieTime > getScene(sceneIndex).endTime);
sceneIndex++;
}
}


public synchronized Image getImage(){
if(scenes.size()==0){
return null;
}else{
return getScene(sceneIndex).pic;
}
}

private OneScene getScene(int x){
return (OneScene)scenes.get(x);
}

private class OneScene{
Image pic;
long endTime;

public OneScene(Image pic, long endTime){
this.pic = pic;
this.endTime = endTime;
}
}
}

import java.awt.*;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
public class felix{
public static void main (String [] args){
felix f = new felix();
f.run();
}

private Animation a;
private ScreenManager s;
private Image bg;

private static final DisplayMode modes1[] = {
new DisplayMode(800, 600, 32, 0),
new DisplayMode(800, 600, 24, 0),
new DisplayMode(800, 600, 16, 0),
new DisplayMode(640, 480, 32, 0),
new DisplayMode(640, 480, 24, 0),
new DisplayMode(640, 480, 16, 0),
};

public void loadImages(){
bg = new ImageIcon("C:\\Users\\Simon\\Desktop\\Java\\Tutori al\\Game Development\\back.png").getImage();
Image face1 = new ImageIcon("C:\\Users\\Simon\\Desktop\\Java\\Tutori al\\Game Development\\orange.png").getImage();
Image face2 = new ImageIcon("C:\\Users\\Simon\\Desktop\\Java\\Tutori al\\Game Development\\blue.png").getImage();
a = new Animation();
a.addScene(face1, 250);
a.addScene(face2, 250);
}

public void run(){
s = new ScreenManager();
try{
DisplayMode dm = s.findFirstCompatibleMode(modes1);
s.setFullScreen(dm);
loadImages();
movieLoop();
}finally{
s.restoreScreen();
}
}

public void movieLoop(){
long startingTime = System.currentTimeMillis();
long cumTime = startingTime;
while (cumTime - startingTime < 5000){
long timePassed = System.currentTimeMillis() - cumTime;
cumTime += timePassed;
a.update(timePassed);

Graphics2D g = s.getGraphics();
draw(g);
g.dispose();
s.update();

try{
Thread.sleep(20);
}catch(Exception ex){
}
}
}

public void draw(Graphics g){
g.drawImage(bg, 0, 0, null);
g.drawImage(a.getImage(), 0, 0, null);
}
}

import java.awt.*;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.lang.reflect.InvocationTargetException;
import javax.swing.JFrame;

public class ScreenManager{

private GraphicsDevice vc;

public ScreenManager(){
GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();
vc = e.getDefaultScreenDevice();
}

public DisplayMode[] getCompatibleDisplayMode(){
return vc.getDisplayModes();
}

public DisplayMode findFirstCompatibleMode(DisplayMode modes[]){
DisplayMode goodModes[] = vc.getDisplayModes();
for(int i = 0; i < modes.length; i++){
for (int j = 0; j < goodModes.length; j++){
if (displayModesMatch(modes[i], goodModes[j])){
return modes[i];
}
}
}
return null;
}

public DisplayMode getCurrentDisplayMode(){
return vc.getDisplayMode();
}

public boolean displayModesMatch(DisplayMode m1, DisplayMode m2){
// Make 3 Separate If Statements For: Resolution, Bit Depth And Refresh Rate
if(m1.getWidth() != m2.getWidth() || m1.getHeight() != m2.getHeight()){
return false;}

if (m1.getBitDepth() != DisplayMode.BIT_DEPTH_MULTI &&
m2.getBitDepth() != DisplayMode.BIT_DEPTH_MULTI &&
m1.getBitDepth() != m2.getBitDepth()){
return false;
}

if (m1.getRefreshRate() != DisplayMode.REFRESH_RATE_UNKNOWN &&
m2.getRefreshRate() != DisplayMode.REFRESH_RATE_UNKNOWN &&
m1.getRefreshRate() != m2.getRefreshRate()){
return false;
}
return true;
}

public void setFullScreen(DisplayMode dm){
JFrame f = new JFrame();
f.setUndecorated(true);
f.setIgnoreRepaint(true);
f.setResizable(true);
vc.setFullScreenWindow(f);

if (dm != null && vc.isDisplayChangeSupported()){
try{
vc.setDisplayMode(dm);
}catch(Exception ex){}
}
f.createBufferStrategy(2);
}

public Graphics2D getGraphics(){
Window w = vc.getFullScreenWindow();
if (w != null){
BufferStrategy s = w.getBufferStrategy();
return (Graphics2D)s.getDrawGraphics();
}else{
return null;
}
}

public void update(){
Window w = vc.getFullScreenWindow();
if(w != null){
BufferStrategy s = w.getBufferStrategy();
if (!s.contentsLost()){
s.show();
}
}
}

public Window getFullScreenWindow(){
return vc.getFullScreenWindow();
}

public int getWidth(){
Window w = vc.getFullScreenWindow();
if(w != null){
return w.getWidth();
}else{
return 0;
}
}

public int getHeight(){
Window w = vc.getFullScreenWindow();
if(w != null){
return w.getHeight();
}else{
return 0;
}
}

public void restoreScreen(){
Window w = vc.getFullScreenWindow();
if(w != null){
w.dispose();
}
vc.setFullScreenWindow(null);
}

public BufferedImage createCompatibleImage(int w, int h, int t){
Window win = vc.getFullScreenWindow();
if(win != null){
GraphicsConfiguration gc = win.getGraphicsConfiguration();
return gc.createCompatibleImage(w, h, t);
}
return null;
}
}

i don't know why but i get the error

java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
at java.util.ArrayList.RangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at Animation.getScene(Animation.java:86)
at Animation.getImage(Animation.java:79)
at felix.draw(felix.java:77)
at felix.movieLoop(felix.java:61)
at felix.run(felix.java:43)
at felix.main(felix.java:8)

Someone Please Tell Me How To Fix It Please