2013-11-15 4 views
0

Этот код в основном добавляет двоичные числа. По какой-то причине я продолжаю получать индекс за пределами ошибки в строке 102, которая представляет собой вложенный цикл forif в нижней части. Может ли кто-нибудь вести меня в правильном направлении?Исключение в теме "main" java.lang.ArrayIndexOutOfBoundsException: 160

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 

public class Process { 

    private String storeString="", x=""; 
    private String polynomial; 

    //get file 
    public void getFileName(String fileName) {       
    try (BufferedReader br = new BufferedReader(new FileReader(fileName))) { 
     String sCurrentLine=""; 

     while ((sCurrentLine = br.readLine()) != null) { 
     storeString+= sCurrentLine.toUpperCase(); 
     } 
    } 
    catch (IOException e) { 
     System.out.println("Sorry no such file is was found!" + 
         "\n\nAre you sure that's the right file name"); 
    } 
    System.out.println(storeString); 

    if (storeString.matches("[0-9A-F]+") == true) { 
     System.out.println("true"); 
     hexToBin(storeString); 
    } else { 
     System.out.println("Sorry that is an Invalid Hex"); 
     System.exit(0); 
    }  
    System.out.println(x); 

    } 

    //convert to binary  
    public void hexToBin(String hex) { 
    String bin = ""; 
    String binFragment = ""; 
    int iHex; 
    hex = hex.trim(); 
    hex = hex.replaceFirst("0x", ""); 

    for (int i = 0; i < hex.length(); i++) { 
     iHex = Integer.parseInt(""+hex.charAt(i),16); 
     binFragment = Integer.toBinaryString(iHex); 

     while (binFragment.length() < 4) { 
     binFragment = "0" + binFragment; 
     } 
     bin += binFragment; 
    } 
    System.out.println("length:" + bin.length()); 
    Calculate(bin.length(), bin); 
    } 

    // calculations 
    public void Calculate(int size, String hex) { 
    char [] poly= new char[17]; 
    char [] charBin= new char[size]; 
    int move=-1,zero=0,L=0; 

    polynomial = "10000100110001101"; 

    //convert to char 
    for (int i=0; i < 17; i++) { 
     poly[i] = polynomial.charAt(i); 
    } 
    //convert hex to char 
    for (int i=0; i < size; i++) { 
     charBin[i] = hex.charAt(i); 
    } 

    //compare with if statements 
    for (int i=0; i < size ; i++) { 
     for(int j=0; j < 17; j++) { 
     move++; 
     if (charBin[move]=='1' && poly[j]=='1') { 
      charBin[move] = '0'; 
     } else if (charBin[move]=='0' && poly[j]=='0') { 
      charBin[move] = '0'; 
     } else { 
      charBin[move] = '1'; 
     } 
     } 

     int k=0; 
     //print charbin 
     //while (charBin[k]!= size) { 
     // System.out.print(charBin[k]); 
     // k++; 
     //} 

    }//end class 

    }//end class 

} 
+2

Пожалуйста, выкладываю трассировку стека, за исключением –

ответ

3

Поскольку вы петля i до size и j до 17 и увеличения move каждый раз, вы можете ожидать move получить до 17 * size - 1. Вы используете его для индексации в массив длины, равный size.

char[] charBin = new char[size]; 
int move = -1; 
... 
for(int i=0;i < size ; i++) { 
    for(int j=0;j < 17;j++) { 
     move++; 
     if(charBin[move]) ... 
    } 
} 
+0

Потрясающие так Если я сбросить ход, я больше не должен получать эту ошибку? –

+0

Спасибо всем за помощь –

2

charBin имеет size места. Но вы обращаетесь к своим значениям в своем цикле, используя move в качестве индекса. move инкрементируется каждый раз, когда внутри второго цикла:

char[] charBin = new char[size]; 
int move = -1; 
for(int i=0;i < size ; i++) { 
    ... 
    for(int j=0;j < 17;j++) { 
     ... 
     move++; 
    } 
} 

во внешнем контуре i бежит от 0 к size и во внутреннем цикле j бежит от 0 к 17. move поэтому имеет потенциальное максимальное значение size * 17. Как только move станет тем же значением, что и size, вы получите исключение, так как вы находитесь за пределами массива (действительные местоположения в charBin работают от 0 до size - 1).

Смежные вопросы