StringIndexOutOfBoundsException String index out of range ошибка


Я получаю эту ошибку, когда я ввожу строку " s " после ввода целого числа.

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
    at java.lang.String.charAt(Unknown Source)
    at oneB.change(oneB.java:4)
    at oneB.main(oneB.java:26)

Ниже приведен код: (обратите внимание, что код все еще завершен, и я ввел некоторые инструкции печати для проверки)

import java.util.Scanner;
public class oneB {
    public static String change(int n, String s, String t) {

        if (s.charAt(0) == 'R') {
            return onetwo(s);
        }
        return s;
    }
    private static String onetwo(String one) {
        int c = one.indexOf('C');
        System.out.print(c);
        char[] columnarray = new char[one.length() - c - 1];
        for (int i = c + 1; i < one.length(); i++) {
            columnarray[i] = one.charAt(i);
        }
        int columnno = Integer.parseInt(new String(columnarray));
        System.out.print(columnno);
        return one;

    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System. in );
        int n = in .nextInt();
        String s = in .nextLine();
        String t = in .nextLine();
        System.out.print(change(n, s, t));
    }

}
6 2

6 ответов:

Вызов in.nextInt() оставляет символ конечной строки в потоке, поэтому следующий вызов in.nextLine() приводит к пустой строке. Затем вы передаете пустую строку функции, которая ссылается на свой первый символ, и таким образом получаете исключение.

Вот как я отладил его:

  • Вы получаете StringIndexOutOfBoundsException с нулевым индексом в строке 4.

  • Это означает, что строка, с которой вы работаете при вызове s.charAt(0), является пустой строкой.

  • Это означает, что s = in.nextLine() задает s пустую строку.

Как это может быть? Ну, то, что происходит, это то, что предыдущий вызов nextInt() прочитал целое число, но он оставил символы после целого числа неиспользованными. Итак, ваш nextLine() читает оставшуюся часть строки (до конца строки), удаляя новую строку и давая вам остальное ... это пустая строка.

Добавьте дополнительный вызов in.readLine(), прежде чем пытаться прочитать строку в s.

Одно другое решение проблемы было бы вместо nextLine(), Используйте только next().

        int n = in .nextInt();
        String s = in .next();

Похоже, что s - это пустая строка "".

   for (int i = c + 1; i < one.length(); i++) {
        columnarray[i] = one.charAt(i);   // problem is here.
    }

Вам нужно начать индекс массива с 0. Но вы начинаете с c + 1

    for (int i = c + 1,j=0; i < one.length(); i++,j++) {
        columnarray[j] = one.charAt(i);
     }

Проблема в том, что когда вы нажимаете enter, за вашим int следует символ '\n'. Просто измените код следующим образом:

public static void main(String[] args) {
    Scanner in = new Scanner(System. in );
    int n = in .nextInt();
    in.nextLine(); //This line consume the /n afer nextInt
    String s = in .nextLine();
    String t = in .nextLine();
    System.out.print(change(n, s, t));
}