2012-11-10 6 views
1

У меня были постоянные проблемы с моим кодом в отношении массивов.Ошибка при запуске кода (проблемы с массивом)?

я получил постоянную строку ошибок:

Исключение в нити "основного" java.lang.ArrayIndexOutOfBoundsException: 1 в Ass1.genTimeArray (Ass1.java:150) в Ass1.main (Ass1.java : 54)

Вот мой код:

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]) ; 




} 
} 

Может кто-нибудь помочь, я имею много проблем с этим кодом!

Благодаря

ответ

4

java.lang.ArrayIndexOutOfBoundsException: 1

Это указывает на то, что у вас есть массив, который имеет длину менее 2-х элементов.

Вы запрашиваете индекс 1 (второй элемент), а Java говорит: «Держитесь за ковбоя, этот массив здесь не достаточно длинный».

Похоже, вам нужно положить еще несколько коров в загон (то есть заполнить массив). :)


После более близкого взгляда, похоже, проблема начинается здесь

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 

и продолжает здесь

double tStep = input.nextDouble(); 
timeArr[n]= genTimeArray(tMax,tStep,n); // <- n is still 1 

и продолжается до того места, где происходит ошибка:

public static int genTimeArray(double tMax , double tStep , int n) { 
    int t[] = new int[n] ; 
+0

Есть ли способ, я могу просто оставить его как n или инициализировать его как любое значение, потому что позже в программе мне нужно заменить его значение и использовать его новое значение. Или это слишком надуманно? – user1810925

+1

Используйте список. Списки намного лучше, чем массивы в ситуациях, когда количество элементов может измениться. – jahroy

+0

Как @jahroy сказал, используйте «Список myList = новый ArrayList '. Они просты в использовании (просто '.add()', '.remove()' и получают их '.size()'), и их длина может измениться (Java не любит массивы, которые изменяют длину). Список находится в 'java.util', если я правильно помню. – Ben

1

Wh по словам Стива, подсчет массивов во многих языках программирования имеет первый элемент как элемент 0 в массиве. Вместо того, чтобы думать об этом как о «0-м» элементе, мне разумно подумать об этом как о начале массива, а затем добавить 0 для первого, начало плюс 1 для второго и так далее.

Кроме того, я думаю, что вы также используете неправильный оператор для проверки равенства в некоторых ваших циклах while.

Следующий цикл никогда не будет выполнен, возможно, попробуйте назначение и инициализацию в одно и то же время.

// will always be false, the while block will never execute 
while (innerLoopFlag = false) { 
Смежные вопросы