Строка не может обрабатывать пробелы? - PullRequest
0 голосов
/ 01 декабря 2018

Итак, я делаю некоторые упражнения на Java, и у меня проблема со строками, которые, кажется, не совсем хорошо обрабатывают пробелы.

Когда я ввожу имя, например «Джо Смит», часть «Смит» заканчивается в переменной программе.И если я напишу «Экономика майор» в переменной программе, вся программа вылетает.(вероятно, потому что points это переменная типа int)

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

import java.util.Scanner;




class Student {
String name;
String program;
int points; 

Scanner userScan = new Scanner(System.in);


String setName() {
    System.out.printf("Please enter name: ");
    String scan = userScan.next();
    name = scan;
    return name;
}

String setProgram() {
    System.out.printf("Please enter program: ");
    String scan = userScan.next();
    program = scan;
    return program;
}

int setPoints() {
    System.out.printf("Please enter points: ");
    int scan = userScan.nextInt();
    points = scan;
    return points;
}

void printStudent() {
    System.out.printf("Name: " + name + "\nProgram:" + program + "\nPoints" + points);    
}
}



public class Kap_2_Ovning_2Student {


public static void main(String[] args) {


   Student student1 = new Student();
   Student student2 = new Student();

   student1.setName();
   student1.setProgram();
   student1.setPoints();
   student1.printStudent();

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Вот JavaDoc для Scanner класса , не могли бы вы проверить его, чтобы в общих чертах понять, как он работает.

Я думаю, что главная проблема здесь в том, что вы хотите читать целикомВызовите метод next(), вместо него можно использовать метод nextLine(), например.

0 голосов
/ 01 декабря 2018

Вы используете new Scanner(System.in), который по умолчанию использует пробелы в качестве разделителя токенов.Каждый раз, когда вы вызываете Scanner.next(), он только читает данные, пока не встретится разделитель.Из метода Scanner.next() javadoc :

Находит и возвращает следующий полный токен с этого сканера.Полному токену предшествует ввод, соответствующий шаблону-разделителю.Этот метод может блокировать ожидание ввода для сканирования, даже если предыдущий вызов hasNext () вернул true.

Если вы хотите разрешить пробелы в ваших токенах, вы должны изменить разделитель, напримерчтобы разделить символы новой строки, используйте:

new Scanner(input).useDelimiter("\\n*");

или используйте Scanner.nextLine().

...