Reputation: 185
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
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
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
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 String
s with ==
, you should use equals
instead as ==
compares references and not values stored in that reference.
Upvotes: 2
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