pta2002
pta2002

Reputation: 185

Why can't I get a value from an ArrayList?

So, I am trying to make a pin cracker, and I don't seem to be able to get the current number from an ArrayList. I am using pin.get(currentChar) to get it. Look at this:

package me.pta2002.pincrack;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

    static Scanner scanner = new Scanner(System.in);

    public static List<Integer> pinNumbers = new ArrayList<Integer>();

    public static void main(String[] args) {
        System.out.println("Insert your first pin number");
        int num1 = scanner.nextInt();
        System.out.println("Insert your second pin number");
        int num2 = scanner.nextInt();
        System.out.println("Insert your third pin number");
        int num3 = scanner.nextInt();
        System.out.println("Insert your fourth pin number");
        int num4 = scanner.nextInt();
        pinNumbers.add(num1);
        pinNumbers.add(num2);
        pinNumbers.add(num3);
        pinNumbers.add(num4);
        System.out.println("Starting the crack!");

        int currentChar = 0;
        int currentNum = 0;

        String pin = "" + pinNumbers.get(0) + pinNumbers.get(1) + pinNumbers.get(2) + pinNumbers.get(3);
        List<Integer> crackedPin = new ArrayList<Integer>();
        crackedPin.add(0);
        crackedPin.add(0);
        crackedPin.add(0);
        crackedPin.add(0);
        String pinCracked = ""+crackedPin.get(0) + crackedPin.get(1) + crackedPin.get(2) + crackedPin.get(3);

        while(pinCracked!=pin){
            if(currentChar<5){
                currentNum++;
                if(currentNum==pinNumbers.get(currentChar)){
                    crackedPin.remove(currentChar);
                    crackedPin.add(currentChar,currentNum);
                    currentNum=0;
                    currentChar++;
                }
            }
        }
        System.out.println(crackedPin);
    }



}

Now, I have no clue what the problem is and I would like to get some help. Here is the error:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)
at me.pta2002.pincrack.Main.main(Main.java:42)

Please help me doing this. (I know I can improve the pin input, I do that later)

Upvotes: 1

Views: 1464

Answers (4)

vineetv2821993
vineetv2821993

Reputation: 937

This is your code, completely working what you want. Read comments for changes/addition

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

    static Scanner scanner = new Scanner(System.in);

    public static List<Integer> pinNumbers = new ArrayList<Integer>();

    public static void main(String[] args) {
        System.out.println("Insert your first pin number");
        int num1 = scanner.nextInt();
        System.out.println("Insert your second pin number");
        int num2 = scanner.nextInt();
        System.out.println("Insert your third pin number");
        int num3 = scanner.nextInt();
        System.out.println("Insert your fourth pin number");
        int num4 = scanner.nextInt();
        pinNumbers.add(num1);
        pinNumbers.add(num2);
        pinNumbers.add(num3);
        pinNumbers.add(num4);
        System.out.println("Starting the crack!");

        int currentChar = 0;
        int currentNum = 0;

        String pin = "" + pinNumbers.get(0) + pinNumbers.get(1) + pinNumbers.get(2) + pinNumbers.get(3);
        List<Integer> crackedPin = new ArrayList<Integer>();
        crackedPin.add(0);
        crackedPin.add(0);
        crackedPin.add(0);
        crackedPin.add(0);
        String pinCracked = ""; //Changed

        while(!pinCracked.equals(pin)){ //Changed Equating reference before, always true
            if(currentChar<4){ //Changed Out of bound
                currentNum++;
                if(currentNum==pinNumbers.get(currentChar)){
                    crackedPin.remove(currentChar);
                    crackedPin.add(currentChar,currentNum);
                    pinCracked+=currentNum; //Added, Change the string instead
                    currentNum=0;
                    currentChar++;
                }
            }
        }
        System.out.println(pinCracked); //Changed
    }



}

Upvotes: 1

Martin
Martin

Reputation: 223

while(pinCracked!=pin){
        if(currentChar<5){
            currentNum++;
            if(currentNum==pinNumbers.get(currentChar)){
                crackedPin.remove(currentChar);
                crackedPin.add(currentChar,currentNum);
                currentNum=0;
                currentChar++;
            }
        }
    }

You have to change here the if. You need if(currentChar<4) Edit: in the last run you have currentchar on 4. which is outofbounds

Upvotes: 2

Maroun
Maroun

Reputation: 95968

When currentChar is 4, you'll be out of bounds:

if(currentNum==pinNumbers.get(currentChar))

pinNumbers has 4 elements, and since arrays are zero based in Java, indexes are in the range [0, N-1].

In your loop, change currentChar < 5 to currentChar < 4.

Note: You're comparing Strings with ==, you should use equals instead as == compares references and not values stored in that reference.

Upvotes: 2

Eran
Eran

Reputation: 393831

pinNumbers.get(currentChar) is out of range when currentChar == 4, since you only add 4 elements to the list.

    while(!pinCracked.equals(pin)){ // another fix, though not related to the exc
        if(currentChar<pinNumbers.size()){ // this is a safer check
            currentNum++;
            if(currentNum==pinNumbers.get(currentChar)){
                crackedPin.remove(currentChar);
                crackedPin.add(currentChar,currentNum);
                currentNum=0;
                currentChar++;
            }
        }
    }

Upvotes: 1

Related Questions