【问题标题】:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -65线程“主”java.lang.ArrayIndexOutOfBoundsException 中的异常:-65
【发布时间】:2015-03-21 16:16:11
【问题描述】:

我正在尝试解决这个问题 https://www.hackerrank.com/challenges/pangrams 这是我的代码

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Pangram {

public static String alltrim(String s)
{   String s1="";
    int i,j,k=0;
    for(i=0;i<s.length();i++)
    {
        char ch=s.charAt(i);
        if(ch!=' ')
        break;
    }
    for(j=s.length()-1;j>=0;j--)
    {
        char ch=s.charAt(j);
        if(ch!=' ')
        break;
    }
    for(k=i;k<j+1;k++) 
     s1 = s1 + s.charAt(k);

 return s1;
}
public static void main(String[] args)
{
    Scanner reader = new Scanner(System.in);
    String input = reader.nextLine();String s,s1;
    s = input.toLowerCase();
    s1 = alltrim(s);
    if( check(s1) )
        System.out.println("pangram");
    else
        System.out.println("not pangram");
}
public static boolean check(String input)
{
    int [] count = new int[26];
    for( int i = 0; i < input.length(); i++ )
    {
        char ch = input.charAt(i);
        count[ch-'a']++;
    }

    for( int cnt:count )
    {
        if( cnt ==0 )
            return false;
    }
    return true;
 }
}

我总是收到这个错误

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -65
      at Pangram.check(Pangram.java:46)
      at Pangram.main(Pangram.java:35)

我正试图找出问题出在哪里,但我无法...谁能帮助我?

【问题讨论】:

  • 那么您是否查看过 Pangram.java 第 46 行并找出您尝试访问无效值的原因?你试过调试吗?提示:您的 alltrim 方法实际上并没有删除所有空间。你可能想使用s1 = s.replace(" ", "");...
  • @JonSkeet 感谢该替换功能,即使在使用替换功能后它也显示出类似的问题线程“主”中的异常 java.lang.ArrayIndexOutOfBoundsException: -43 at Pangram.check(Pangram.java:26 ) 在 Pangram.main(Pangram.java:15) ------> 第 26 行:count[ch-'a']++; -------> 第 15 行: if( check(s1) ) 他们有什么问题吗?
  • 了解您输入的哪个值会遇到越界异常也会有所帮助。
  • int i,j,k=0;不必要。不需要在循环之外声明它们,因为您已经在每个 for 循环的开头声明了所需的变量。
  • @coder101:又一次,你试过调试吗?了解如何自己诊断问题至关重要

标签: java arrays exception pangram


【解决方案1】:

这是一种方法

    public static void main(final String[] args) throws IOException {
         Scanner reader = new Scanner(System.in);
         String line = reader.nextLine();
            // Verify input argument length.

            final char[] allCharacters = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
                    'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };

            
                    final TreeSet<Character> charactersPresent = new TreeSet<Character>();

                    // Parse the line into letters.
                    final char[] letters = line.toLowerCase().toCharArray();

                    // Keep a set of those that are present.
                    for (final char letter : letters) {
                            charactersPresent.add(letter);
                    }

                    // Print the letters present in the alphabet but not in the input.
                    final StringBuilder missingLettersBuilder = new StringBuilder();
                    for (final char character : allCharacters) {
                            if (!charactersPresent.contains(character)) {
                                    missingLettersBuilder.append(character);
                            }
                    }

                    if (missingLettersBuilder.length() == 0) {
                            System.out.println("This is  a PANGRAM");
                    } else {
                            System.out.println("Not a PANGRAM because it doesn't have "+missingLettersBuilder.toString());
                    }
            }

【讨论】:

    【解决方案2】:

    问题出在

    count[ch-'a']++;
    

    其中 ch 是 6(如您输入的那样)并且您减去 '6'-'1' 因此它通过减去 ASCII 值来生成一个值并给出

    count[-43]++;
    

    【讨论】:

      【解决方案3】:

      java.lang.ArrayIndexOutOfBoundsException: -65 的发生是因为您在 ASCII 表 (32-97=-65) 中用 32 表示的空格字符减去 a(97)

      这意味着问题出在您的 allTrim 方法中,它没有像您预期的那样替换所有空格。

      如果要替换字符串的所有空格,可以使用String的replaceAll方法。

      丢弃s1 = alltrim(s); 行并将其替换为s1 = s.replaceAll(" ", "");

      现在输入你在 cmets 中给我的输入

      aaabbb abc mnop xyyx xaxbbbxx

      不会给出任何例外。

      至于您遇到的其他异常(超出范围-43),只是因为您输入了

      6 aaabbb abc mnop xyyx xaxbbbxx

      6在ASCII表中用54表示,54-97 = 43。看看你给我们的链接的要求,你应该只比较字母所以我想这是一个错误。

      请注意,您可以轻松删除字符串的所有数字,您的替换行将变为:

      s1 = s.replaceAll(" ", "").replaceAll("\\d", "");
      

      现在进入也不会报错

      6 aaabbb abc mnop xyyx xaxbbbxx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-13
        • 2011-09-09
        • 2016-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-19
        相关资源
        最近更新 更多