Как заставить код отвечать, если пользователь ничего не вводит и просто нажимает enter?

#java

#java

Вопрос:

Я хочу, чтобы мой код отвечал, если пользователь нажимает только enter и больше ничего не вводит. Я использую .trim, чтобы реагировать только на ввод пробелов, но это выдает ошибку, когда я просто нажимаю enter в качестве входных данных. Вот что у меня есть на данный момент:

 
import java.util.Scanner;

class Main {

    static Scanner name = new Scanner(System.in);

    public static void main(String[] args) {
        System.out.println("What is your first name?");
        String a = name.nextLine();
        String b = a.substring(0, 1).toUpperCase()   a.substring(1);
        String c = a.trim();
        if (c.length() != 0) {
            if (a.contains(" ")) {
                System.out.println("You put space in your name. : (");
            } else {
                System.out.println(b   " is a nice name! : )");
            }
        } else {
            System.out.println("Thats not a name! : (");
        }
    }
}
  

Комментарии:

1. Вы не можете использовать substring(0,1) пустую строку. Почему бы не проверить, пусто ли оно, прежде чем пытаться это сделать?

2. Пожалуйста, также опубликуйте ошибку (полное сообщение об ошибке), которое было показано вам.

Ответ №1:

 try (Scanner scan = new Scanner(System.in)) {
    System.out.println("What is your first name?");

    String str = scan.nextLine().trim();

    if (str.isEmpty())
        System.err.println("You entered an empty name");
    else if (str.contains(" "))
        System.err.println("You put space in your name.");
    else {
        String name = Character.toUpperCase(str.charAt(0))   str.substring(1);
        System.out.println('''   name   "' is a nice name!");
    }
}
  

Ответ №2:

Я думаю, что это, вероятно, то, что вы хотите. Кроме того, я также выделил несколько лучших практик.

 class Main {

    private static Scanner scanner = new Scanner(System.in); // Point 0 - Use access modifiers!

    public static void main(String[] args) {

        System.out.println("What is your first name?");
        String name = ""; // Point 1 - Initialize your variables to avoid NullPointerException

        // Point 2 - Always check if there is something to read from scanner
        if (scanner.hasNextLine()) {
            name = scanner.nextLine();
        }

        // Point 3 - You can methods in place instead of stack variables
        if (!name.isEmpty()) {
            if(name.contains(" ")) {
                System.out.println("You put space in your name. : (");
            } else {
                // Point 4 - You can do away with extra variables
                System.out.println(capitalize(name)   " is a nice name! : )");
            }
        } else {
            System.out.println("That's not a name! : (");
        }

        scanner.close(); // Point 5 - Clean up your resources
    }

    // Point 6 - Concise methods makes code more readable
    private static String capitalize(String str) {
        return str.substring(0, 1).toUpperCase()   str.substring(1);
    }
}
  

Вы можете посмотреть больше о сканере.

Комментарии:

1. строка b просто вводит первую букву имени пользователя, если они этого не сделали, извините, что не даю большого контекста для этого.

2. «Всегда проверять» ? Абсолютно нет, и определенно не так! — Для простых программ, где код может вызывать исключение и завершаться, когда System.in не подключен к источнику ввода, отсутствие проверки, безусловно, является допустимой практикой кодирования. — И если вы проверите, вы определенно должны справиться с ситуацией лучше, чем печатать «Это не имя! : (» и завершать программу, когда у пользователя даже не было возможности ввести данные или нажать Ctrl-Z. — И не пытайтесь вызывать close() вне метода, потому что это не будет компилироваться.