Дана строка. Выведите в консоль длину этой строки

Почему он считает тип int за строку?

package org.example;
import java.util.Scanner;

public class Task_3 {
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);

        System.out.print("Введите строку: ");
        String str = input.nextLine();

        int length = str.length();

        System.out.println("Длина строки:" + length);

        if (!input.hasNext())
            System.out.println("Введите только текст!");
        }
    }
}

Как можно исправить ошибку, желательно не используя какие-то новые методы, функции и т.д.?


Ответы (1 шт):

Автор решения: Nowhere Man

Предположение, что тип String содержит "только буквы из алфавита" изначально неверно, так как строки содержат любые символы (а не только буквы из разных алфавитов), включая цифры, знаки пунктуации, пробельные символы, специальные символы.

Если для ввода данных используется метод Scanner::nextLine, то будет возвращаться строка с любыми символами, кроме символа перевода строки, то есть такая строка вполне может содержать несколько слов, разделённых пробельными символами.

Метод Scanner::next также используется для ввода строк (токенов), разделённых (по умолчанию) любыми пробельными символами.

Однако судя по неявно описанному условию задачи, в ней необходимо ограничить диапазон вводимых символов (в данном случае "буквами из алфавита"), то для ввода данных нужно использовать перегруженный вариант данного метода Scanner::next(String pattern), принимающий на вход шаблон, описывающий допустимый формат строки.
Примеры шаблонов:

  • Только буквы из разных алфавитов: scanner.next("\\p{L}+")
  • Только прописные(большие) буквы из разных алфавитов: scanner.next("\\p{Lu}+")
  • Буквы только из английского алфавита: scanner.next("[A-Za-z]+")
  • Буквы только из русского алфавита: scanner.next("[А-Яа-яЁё]+")
  • Буквы из русского и английского алфавитов: scanner.next("[A-Za-zА-Яа-яЁё]+")
  • Любые непробельные нецифровые символы: scanner.next("\\D+")

Следует учесть, что признаком окончания ввода будет ввод пробельного символа.
При обнаружении в токене любого символа, не удовлетворяющего указанному шаблону, будет выброшено исключение InputMismatchException.

Пример:

Scanner sc = new Scanner(System.in);

System.out.println("введите строку: ");

String str = sc.next("\\p{L}+");

System.out.println("длина строки: " + str.length());

Результаты:

введите строку: 
абв12 Exception in thread "main" java.util.InputMismatchException
    at java.base/java.util.Scanner.throwFor(Scanner.java:947)
    at java.base/java.util.Scanner.next(Scanner.java:1602)
    at java.base/java.util.Scanner.next(Scanner.java:1533)
введите строку: 
hello
длина строки: 5
→ Ссылка