#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()
вне метода, потому что это не будет компилироваться.