2013-10-06 84 views
0

我是新来编码,我一直在写这段代码,并试图使其工作,但每次运行它崩溃。我已经查找了一些东西,并将编写这段代码,我已经遵循了java的网站,了解如何正确写下代码以及本网站。java.lang.ArrayIndexOutOfBoundsException:4错误

不管怎么说,如果有人能向我解释为什么这不起作用,因为在我看来,逻辑在那里,但我不明白它为什么会崩溃。

我的代码:

import java.util.Scanner; 
    import java.lang.String; 
    import java.util.*; 
    public class Question1 
    { 
     public static void main(String[] args) 
      { 
      Scanner keyboard= new Scanner(System.in); 
      System.out.println("Enter either letters or numbers and I'll magically tell you if they are consecutive :D"); 
      String inputedString= keyboard.nextLine(); 
      boolean consecutiveOrNot=isConsecutive(inputedString); 
      System.out.println("Drum rolls...... Is it consecutive: "+ consecutiveOrNot); //Problem with this line? 
      } 


     public static boolean isConsecutive(String inputedString) 
      { 
      //Storing string's units into an array and converting to UpperCase if necessary 
      //and storing string's numerical value into the variable 'arrayCharToInt' 
       char[] charIntoArray= new char[inputedString.length()]; 
       int[] arrayCharToInt= new int[inputedString.length()]; 
       for (int i=0;i<inputedString.length();i++) 
       { 
        charIntoArray[i]=inputedString.charAt(i); 
        if (Character.isLetter(charIntoArray[i]) && Character.isLowerCase(charIntoArray[i])) 
        { 
         charIntoArray[i]= Character.toUpperCase(charIntoArray[i]); 
         } 
        arrayCharToInt[i]=(int) charIntoArray[i]; 
       } 




      // The next if statements and the methods that they call are used to verify 
      //that the content of the initial string is either letters or numbers, but not both together 
       boolean[] continuous= new boolean[arrayCharToInt.length]; 
       boolean[] testContNumbersDecreasing= new boolean[arrayCharToInt.length]; 
       boolean[] testContNumbersIncreasing= new boolean[arrayCharToInt.length]; 
       boolean[] testContLettersDecreasing= new boolean[arrayCharToInt.length]; 
       boolean[] testContLettersIncreasing= new boolean[arrayCharToInt.length]; 
       Arrays.fill(continuous, true); 
       if (lowestValue(arrayCharToInt)>=65 && highestValue(arrayCharToInt)<= 90) 
       { 
        for (int x=0;x<arrayCharToInt.length ;x++) 
        { 
         testContLettersIncreasing[x]=((arrayCharToInt[x+1]-arrayCharToInt[x]== 1) || (arrayCharToInt[x+1]-arrayCharToInt[x]== -25)); 
         testContLettersDecreasing[x]=((arrayCharToInt[x]-arrayCharToInt[x+1]== 1) || (arrayCharToInt[x]-arrayCharToInt[x+1]== -25)); 
        } 
        return (Arrays.equals(continuous,testContLettersIncreasing) || Arrays.equals(continuous,testContLettersDecreasing)); 
       } 

       else if ((lowestValue(arrayCharToInt) >= 48) && (highestValue(arrayCharToInt)<= 57)) 
       { 
        for (int x=0;x<arrayCharToInt.length ;x++) 
        { 
         testContNumbersIncreasing[x]=((arrayCharToInt[x+1]-arrayCharToInt[x]== 1) || (arrayCharToInt[x+1]-arrayCharToInt[x]== -9)); 
         testContNumbersDecreasing[x]=((arrayCharToInt[x]-arrayCharToInt[x+1]== 1) || (arrayCharToInt[x]-arrayCharToInt[x+1]== -9)); 
        } 
        return (Arrays.equals(continuous,testContNumbersIncreasing) || Arrays.equals(continuous,testContNumbersDecreasing)); 

       } 
       else 
       { 
        return false; 
       } 

      } 



     public static int lowestValue(int[] array) 
      { 
       int lowest=array[0]; 
        for (int counter=0; counter< array.length; counter++) 
        { 
         if(lowest>array[counter]) 
          lowest= array[counter]; 
        } 
        return lowest; 
      } 

     public static int highestValue(int[] array) 
      { 
       int highest=array[0]; 
       for (int counter=0; counter< array.length; counter++) 
        { 
         if(highest<array[counter]) 
         highest= array[counter]; 
        } 
       return highest; 
      } 

    } 

主要方法似乎是很好,因为它把一切都在isConsecutive方法,除了评论“返回true;”而且程序确实运行并打印为真。所以我知道问题在于第二种方法。

如果有什么我没有做的权利请告诉我,那将不胜感激。毕竟我还在学习。

感谢

+0

的是有一个堆栈跟踪? – Meistro

回答

0

你的所有来电arrayCharToInt[x+1]的打算出界对他们所在的循环的最后一次迭代(例如,如果arrayCharToInt.length等于5,最高的是x还将会持续下去是4.但是然后x+1等于5,这对于具有五个单元的数组而言是超出限制的)。你需要进行某种if(x == arrayCharToInt.length - 1)检查。

在该方法isConsecutive内部的for循环
+0

它成功了,谢谢你,这就是我所做的,加上我加了'继续'。跳过造成错误的循环 –

+0

太棒了,很高兴它工作。对你而言,教你自己如何从教程中做到这一点很好(很多人没有耐心!)。下一步,我强烈建议您简化此代码。实际上,您可以获得与您拥有的代码量的10%相同的结果。只要在字符串的每个字符上循环,并且对于不是第一个字符的每个字符,如果字符与前一个字符相同,则将'consecutiveOrNot'设置为'true',并将'break'从循环中移出。如果这从来没有发生,那么你知道没有连续的。这将会更加高效和可读。 –

0

for (int x=0;x<arrayCharToInt.length ;x++),您已经使用arrayCharToInt[x+1]

如果arrayCharToInt lenth为4,则你必须arrayCharToInt [0]arrayCharToInt [3]

现在考虑这样的语句:arrayCharToInt[x+1] 当x是3本声明将evalueate到arrayCharToInt[4]导致数组索引越界异常

相关问题