2015-06-07 38 views
0

好的,所以我正在編寫這個程序,其中一部分數組被設置爲數組另一部分的值。相關的代碼是(它是由一路行50):陣列空間足夠時出現邊界錯誤Java Array Index

variables[(program[1])+2]=inputs[0]; 

這裏是其中數組得到初始化:

int[] variables; 
    variables=new int[10000]; 

程序數組:

int[] program; 
    program=new int[10000]; 

而輸入陣列:

int[] inputs; 
    inputs=new int[9]; 

當我運行它,它會產生錯誤:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 
at Central.main(Central.java:50) 

任何想法?提前致謝。

OK,這裏是整個代碼:

import java.util.Random; 

進口java.util.Scanner的;

公共類中央{

public static void main(String[] args) { 
    int[] inputs; 
    inputs=new int[9]; 
    int[] outputs; 
    outputs=new int [9]; 
    int[]results; 
    results=new int [10000]; 
    int[] program; 
    program=new int[10000]; 
    int[][] random; 
    random=new int[100][100]; 
    int[] bestProgram; 
    bestProgram=new int[10000]; 
    int[] bestVariables; 
    bestVariables=new int [10000]; 
    int[] variables; 
    variables=new int[10000]; 
    int[][] bestRandom; 
    bestRandom=new int [100][100]; 
    Scanner sc = new Scanner(System.in); 
    inputs[0]=sc.nextInt(); 
    inputs[1]=sc.nextInt(); 
    inputs[2]=sc.nextInt(); 
    inputs[3]=sc.nextInt(); 
    inputs[4]=sc.nextInt(); 
    inputs[5]=sc.nextInt(); 
    inputs[6]=sc.nextInt(); 
    inputs[7]=sc.nextInt(); 
    outputs[0]=sc.nextInt(); 
    outputs[1]=sc.nextInt(); 
    outputs[2]=sc.nextInt(); 
    outputs[3]=sc.nextInt(); 
    outputs[4]=sc.nextInt(); 
    outputs[5]=sc.nextInt(); 
    outputs[6]=sc.nextInt(); 
    outputs[7]=sc.nextInt(); 
    program=createProgram(program); 
    random=createRandom(random, program); 
    for (int g=0;g<=100;g++) { 
    random=createRandom(random,program); 
    variables=new int [program[1]+2]; 
    variables[program[1]+1]=1; 
    results[0]=run (program,variables,random); 
    variables[(program[1])+2]=inputs[0]; 
    results[1]=run (program,variables,random); 
    variables[program[1]+2]=inputs[1]; 
    results[2]=run (program,variables,random); 
    variables[program[1]+2]=inputs[2]; 
    results[3]=run (program,variables,random); 
    variables[program[1]+2]=inputs[3]; 
    results[4]=run (program,variables,random); 
    variables[program[1]+2]=inputs[4]; 
    results[5]=run (program,variables,random); 
    variables[program[1]+2]=inputs[5]; 
    results[6]=run (program,variables,random); 
    variables[program[1]+2]=inputs[6]; 
    results[7]=run (program,variables,random); 
    variables[program[1]+2]=inputs[7]; 
    bestProgram=findBestProgram(program, variables, random, bestProgram, bestVariables, bestRandom, inputs, outputs, results); 
    } 
    for (int i=0;i<=program[0];i++) 
    { 
    System.out.println(bestProgram[i]); 
    } 
    } 
    public static int[] createProgram(int[] program) { 
    program[0]=randInt(1,50); 
    program[1]=randInt(1,3); 
    for (int i=2;i<=program[0];i++) 
    { 
    program[i]=randInt(1,3); 
    } 
    return program; 
    } 
    public static int run(int[] program, int[] variables,int[][] random) 
    { 
    for (int i=2;i<=program[0];i++) { 
    switch (program[i]) { 
    case 1: variables[random[i][0]]=variables[random[i][1]]+variables[random[i][2]]; 
    break; 
    case 2: variables[(random[i][0])]=(variables[(random[i][1])])-(variables[random[i][2]]); 
    break; 
    default: System.out.println("This error really shouldn't happen ever"); 
    } 
    } 
    return variables[0]; 
    } 
    public static int[][] createRandom(int[][] random, int[] program) 
    { 
    for (int i=0;i<=program[0];i++) 
    { 
    for (int a=0; a<=2;a++) 
    { 
    random[i][a]=randInt(1,3); 
    } 
    } 
    return random; 
    } 
    public static int[] findBestProgram(int[] program, int[] variables, int[][] random,int[] bestProgram, int[]bestVariables, int[][]bestRandom, int[] inputs, int[] outputs, int[] results) 
    { 
    int bestProgramResult=run(bestProgram, bestVariables,bestRandom); 
    int[] resultz; 
    resultz= new int [10000]; 
    resultz[0]=Math.abs(results[0]-outputs[0]); 
    resultz[1]=Math.abs(results[1]-outputs[1]); 
    resultz[2]=Math.abs(results[2]-outputs[2]); 
    resultz[3]=Math.abs(results[3]-outputs[3]); 
    resultz[4]=Math.abs(results[4]-outputs[4]); 
    resultz[5]=Math.abs(results[5]-outputs[5]); 
    resultz[6]=Math.abs(results[6]-outputs[6]); 
    resultz[7]=Math.abs(results[7]-outputs[7]); 
    int programResult=results[0]+results[1]+results[2]+results[3]+results[4]+results[5]+results[6]+results[7]; 
    if (programResult<bestProgramResult) 
    { 
    bestProgramResult=programResult; 
    for (int i=0;i<=program[0];i++) 
    { 
    bestProgram[i]=program[i]; 
    bestVariables[i]=variables[i]; 
    bestRandom[i]=random[i]; 
    } 
    } 
    return bestProgram; 
    } 
    public static int randInt(int min, int max) { 
     Random rand = new Random(); 
     int randomNum = rand.nextInt((max - min) + 1) + min; 
     return randomNum; 
    } 
    } 
    //1: _=_+_ 
    //2: _=_-1 
+0

請提供相關部分的代碼。 – user3707125

+0

Central.java的第50行是什麼? – JamesB

+0

variables [(program [1])+ 2] = inputs [0]; – APCoding

回答

0

問題出在下面一行:variables=new int [program[1]+2]; 基本上,如果我的理解是正確的,你重新初始化變量數組,改變它的大小爲5。然後,在第50行:variables[(program[1])+2]=inputs[0];你想訪問陣列的第5個索引時,索引的範圍爲0到4.

+0

謝謝,正是我需要的。 – APCoding

0

,因爲你試圖訪問未通過陣列的尺寸界定的指標,您接收到異常。換句話說,program[1] + 2大於9999,這是變量數組中最大的索引號。

+0

program [1] = randInt(1,3); – APCoding

+0

randInt是:Random rand = new Random(); \t \t int randomNum = rand.nextInt((max-min)+ 1)+ min; \t \t return randomNum; – APCoding

+0

我的第一個猜測是你試圖訪問的索引要麼小於0,要麼大於9999。你能發佈整個代碼嗎? –

相關問題