Reputation: 63
I have been having constant problems with my code concerning arrays .
I received a constant string of errors :
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 at Ass1.genTimeArray(Ass1.java:150) at Ass1.main(Ass1.java:54)
Here's my code :
import java.util.* ;
public class Ass1 {
static int VIX = 0 ; // Traversing Voltage Component in Component Value Array
static int CIX = 1 ; // Traversing Capacitor
static int LIX = 2; // Traversing Inductor
static int RIX = 3; // Traversing Resistor
public static void main (String args[]) {
System.out.println(
double[] compArr = getCircuitComp() ;
System.out.println("-----------------------------------------------------") ;
System.out.println("");
System.out.println("Voltage Source V = " + compArr[VIX]+ "volts") ;
System.out.println("Capacitor C = " + compArr[CIX]+ "farads");
System.out.println("Inductor L = " + compArr[LIX] + " henrys") ;
System.out.println("Resistor R =" + compArr[RIX] + "ohms") ;
System.out.println("-----------------------------------------------------") ;
boolean outerLoopFlag ;
boolean innerLoopFlag ;
int i ;
int n = 1 ;
int qArray[] = new int[n] ;
int timeArr[] = new int [n] ;
System.out.println("-----------------------------------------------------") ;
Scanner input = new Scanner (System.in) ;
while ( outerLoopFlag = true) {
System.out.println("Reset Component Values (y/n) ?") ;
String answer = input.nextLine() ;
char ans = answer.charAt(0) ;
if ( ans == 'y') {
getCircuitComp() ;
}
else {
}
innerLoopFlag = true ;
while ( innerLoopFlag = true){
System.out.print("Run a simulation?") ;
String answer2 = input.nextLine() ;
char ans2 = answer2.charAt(0) ;
if (ans2 == 'y'){
System.out.println("Enter a maximum time :") ;
double tMax = input.nextDouble();
System.out.println("Enter a time step:") ;
double tStep = input.nextDouble();
timeArr[n]= genTimeArray(tMax,tStep,n);
qArray[n] = genQArray( timeArr , n , compArr) ;
displayQFunction(timeArr,qArray,n );
}
else{
innerLoopFlag = false ;
}
System.out.println("-----------------------------------------------------") ;
while (innerLoopFlag = false) {
System.out.println("Do you want to quit (y/n)?") ;
String answer3 = input.nextLine() ;
char ans3 = answer3.charAt(0) ;
if ( ans3 =='y' ){
System.exit(0);
}
else{}
}
}
}
}
////////////////////////////
///*getCircuitComp Method //
public static double[] getCircuitComp() {
Scanner input = new Scanner (System.in) ;
boolean flag = true ;
double compArr [] = new double[4];
do{
System.out.println("Enter a value V ( 4 to 15):") ;
compArr[VIX] = input.nextDouble() ;
if ((compArr[VIX] >= 4.0) && (compArr[VIX] <= 15.0)){
flag = false ;
}
else{
System.out.println("Bad Value" + compArr[VIX] ) ;
}
} while ( flag );
flag = true ;
while (flag) {
System.out.println("Enter a value for R ( 5 to 10) :") ;
compArr[RIX] = input.nextDouble();
if((compArr[RIX] >= 5.0) && (compArr[RIX] <= 10.0)){
flag = false;
}
else{
System.out.println("Bad Value:"+ compArr[RIX]) ;
}
}
flag = true ;
while(flag) {
System.out.println("Enter a value for C( 1e-9 to 1e-7 ): ") ;
compArr[CIX] = input.nextDouble();
if (( compArr[CIX] >= Math.pow(10, -9)) && (compArr[CIX] <= Math.pow(10, -7))){
flag = false ;
}
else{
System.out.println("Bad Value :"+ compArr[CIX]);
}
}
flag = true ;
while(flag){
System.out.println("Enter a value for L(1e-3 to 1e-1) ");
compArr[LIX] = input.nextDouble();
if(compArr[LIX]>= Math.pow(10,-3) && compArr[LIX] <= Math.pow(10, -1)){
flag = false ;
}
else{
System.out.println("Bad Value :" + compArr[LIX]) ;
}
}
return compArr ;
}
////////////////////////////
///*getTimeArray Method //
public static int genTimeArray( double tMax , double tStep , int n ) {
int t[] = new int[n] ;
n = 1 ;
t[0] = 0 ;
if(t[n] < tMax){
t[n] = (int) (t[n-1] + tStep) ;
n = n + 1 ;
}
return t[n] ;
}
public static int genQArray( int timeArr[] , int n , double compArr [] ) {
double q[] = new double[n] ;
n = 1 ;
double s = (compArr[VIX])*(compArr[CIX]) ;
double t = Math.exp((-compArr[RIX])/(2*compArr[LIX]));
double c = (1)/((compArr[LIX])*(compArr[CIX])) ;
double v = Math.pow((compArr[RIX])/(2*(compArr[LIX])),2) ;
double r = (timeArr[n])*(Math.sqrt(c-v)) ;
q[n] = (s)*(t)*(Math.cos(r)) ;
return (int) q[n] ;
}
////////////////////////////
///*displayQFunction Method //
public static void displayQFunction(int[] timeArr , int[] qArray ,int n ){
n = 1 ;
System.out.println( timeArr[n] + qArray[n]) ;
}
}
Could anyone help , I am having a lot of trouble with this code !
Thanks
Upvotes: 1
Views: 148
Reputation: 57209
java.lang.ArrayIndexOutOfBoundsException: 1
This indicates that you've got an array that is less than 2 elements long.
You're requesting index 1 (the second element), and Java is saying, "hold on cowboy, this here array's not long enough."
Looks like you need to put some more cows in the corral (that is, populate your array). :)
After a closer look, it looks like the problem starts here
boolean outerLoopFlag ;
boolean innerLoopFlag ;
int i ;
int n = 1 ; // <- Here's a problem
int qArray[] = new int[n] ;
int timeArr[] = new int [n] ; // <- because your array is now only 1 element long
and continues down here
double tStep = input.nextDouble();
timeArr[n]= genTimeArray(tMax,tStep,n); // <- n is still 1
and continues on to the place where the error happens:
public static int genTimeArray( double tMax , double tStep , int n ) {
int t[] = new int[n] ;
Upvotes: 4
Reputation: 3599
What Steve said, array counting in a lot of programming languages has the first element as item 0 in the array. Instead of thinking about it as the '0th' element, it makes sense to me to think about it as going to the start of the array, and then adding 0 for the first, the start plus 1 for the second and so on.
Also, I think you are also using the wrong operator to test for equality in some of your while loops.
The following loop will never execute, maybe try the assignment and initialization at the same time.
// will always be false, the while block will never execute
while (innerLoopFlag = false) {
Upvotes: 1