java.lang.StringOutOfBoundsException无法弄明白

时间:2016-08-02 09:34:08

标签: java indexoutofboundsexception

这段代码应该检查一个数字是否是回文。 每当我运行方法检查Palindrome时,它会出现java.lang.StringOutOfBoundsException

请帮忙。

import java.util.*;

/**
 * Lab 1 .
 * @author Kevin Rasquinha
 * @version 30 July 2016
 */
public class Lab1
{
    private Scanner scan = new Scanner(System.in);

    /**
     * count the number of digits in a number
     * @param num the number to analyse
     * @return the number of digits it has
     */
    public int numDigits (int num)
    {
        int nDigits = 0;
        int digit;
        while (num>0)
        {
            digit = num % 10;       // take off the last digit
            num = num /10;          // reduce the number
            nDigits = nDigits + 1;  // increment count of digits
        }
        return nDigits;
    }

    /**
     * Read a number from the keyboard, and report how many digits it has.
     * Ensure the number is within a desired range.
     */
    public void countDigits ()
    {
        int num=0;
        while (num<1 || num > 1000)
        {
            System.out.print("What number (1 to 1000)? ");
            num = scan.nextInt();
            scan.nextLine();
            System.out.println("Num = " + num);
            if (num<1 || num > 1000)
                System.out.println("1 to 1000, please");
        }
        System.out.println (num + " has " + numDigits(num) + " digits");
    }

    /**
     * method used to if a number is the sum of the cube of its digits
     * @param args (not used)
     */
    public void sumCubesDigits ()
    {
        for (int initial = 1; initial < 1000; initial ++)
        {
            int num = initial;
            int thirddig = num%10;
            num = num / 10;
            int secdig = num%10;
            num = num / 10;
            int firstdig = num%10;
            int sum = (thirddig*thirddig*thirddig) + (secdig*secdig*secdig) + (firstdig*firstdig*firstdig);
            if (sum == initial)
            {
                System.out.println ("The number " + initial + " is equal to the sum of the cube of its digits.");
            }
         }
    }

    /**
     * Recieves an int and writes the same int backwards
     * @param args (not used)
     */
    public int backwards(int num)
    {
        int rev = 0;
        int value = num;
       while (value != 0)
        {
            rev = rev*10;
            rev = rev + value%10;
            value /= 10;
        }
        return rev;
    }

    /**
     * Receives digit from method backwards
     * Asses whether backwards  = the original number
     * @param args (not used)
     */
    public boolean palindrome (int num, int digit)
    {
        boolean a = false;
        int normal = num;
        int reversed = digit;
        if( reversed == digit)
        {
           a = true;
        }
        return a;
    }

    /**
     * Recieves int from user - num
     * Sends num to backwards
     * Sends num to palindrome
     * Recieves boolean from palindrome
     * Outputs message to user
     */
    public void checkPalindrome ()
    {
        System.out.println ("Enter number to be see if it is a palindrome");
        int num = scan.nextInt();
        int digit = backwards(num);
        boolean check = palindrome (num, digit);
        if (check = true)
        {
            System.out.println("Your number is a palindrome");
        }
    }

    /**
     * Present a menu to the user, and obtain their selection. If they
     * type an erroneous value, report it and try again. Either upper
     * case or lower case input is accepted.
     * @return an upper case character showing the user's choice
     */

    public char menuChoice ()
    {
        System.out.println("");
        System.out.println("What do you want to do?");
        System.out.println("(c) Count the digits in a number");
        System.out.println("(g) Find out the numbers where the the sum of the cube of its digits is equal to it");
        System.out.println("(p) Find out if a number is a palindrome");
        System.out.println("(q) Quit");
        System.out.print("Your choice? ");
        char answer = ' ';
        boolean ok = false;
        while (! ok)
        {
            answer = scan.nextLine().trim().toUpperCase().charAt(0);
            ok = (answer == 'C' || answer == 'Q' || answer == 'G' || answer == 'P');
            if (! ok)
            {
                System.out.println("Please type one of c,C,q,Q,g,G,p,P");
                System.out.print("Your choice? ");
            }
        }
        return answer;
    }

    /**
     * test driver for the program
     */
    public void test()
    {
        char answer = ' ';
        while (answer != 'Q')
        {
            answer = menuChoice();
            switch (answer)
            {
                case 'C': countDigits(); break;
                case 'G': sumCubesDigits(); break;
                case 'P': checkPalindrome();break;
                case 'Q': break;
            }
        }
    }

        /**
     * main program: create a test driver and let it loose
     * @param args (not used)
     */
    public static void main (String [] args)
    {
        Lab1 l1 = new Lab1();
        l1.test();
    }
}

2 个答案:

答案 0 :(得分:0)

当您使用InputIterator从字符串中选择一个字符时,大部分时间都会引发StringIndexOutOfBoundsException

我想你的问题在这里:

charAt

因为这是代码中唯一的answer = scan.nextLine().trim().toUpperCase().charAt(0);

如果用户什么都没输入,该行会怎么做?当然要charAt

答案 1 :(得分:0)

您应该将if (check = true)更改为if (check == true),将answer = scan.nextLine().trim().toUpperCase().charAt(0);更改为answer = scan.nextLine(); if(answer != null) answer = answer.trim().toUpperCase().charAt(0);