Как использовать сканер для анализа парных разрядов - PullRequest
0 голосов
/ 01 ноября 2019

Я написал код, который читает в файле, как это:

Daan Jansen M     1.78  83
Sophie Mulder    V     1.69  60"

Он должен вернуть результат, как это:

Mr. Johnson’s BMI is 26.2 and is unhealthy.
Mrs. Miller’s BMI is 21.0 and is healthy."

Это основано на вычисленииweight / length2, которые являются двумя последними числами из входного файла.

После запуска кода и выбора файла я получаю ошибку followig:

Exception in thread "main" java.util.InputMismatchException
    at java.base/java.util.Scanner.throwFor(Unknown Source)
    at java.base/java.util.Scanner.next(Unknown Source)
    at java.base/java.util.Scanner.nextDouble(Unknown Source)
    at BodyMassIndex.BodyMassIndex.readLine(BodyMassIndex.java:28)
    at BodyMassIndex.BodyMassIndex.readFileIn(BodyMassIndex.java:18)
    at BodyMassIndex.BodyMassIndex.start(BodyMassIndex.java:39)
    at BodyMassIndex.BodyMassIndex.main(BodyMassIndex.java:43)

Я не получаючто я делаю не такКто-нибудь видит проблему?

Вот код основного класса и класса Person, который хранит данные из файла.

package BodyMassIndex;

import java.io.PrintStream;

class Person {
PrintStream out;

static final char GENDER_MEN = 'M';
static final char GENDER_WOMAN = 'V';
static final double MINIMUM_BMI= 18.5;
static final double MAXIMUM_BMI=25.0;

double length;
int weight;
char gender;
double bmi;
String name;
String surname;
String status;
String call;

Person(double length, int weight,char gender,String name,String surname){
    this.length= length;
    this.weight=weight;
    this.gender= gender;
    this.name=name;
    this.surname=surname;
}

String checkGender(){
    if(gender=='M'){
        call="Mr";
    }
    else{
        call="Mrs" ; 
    }return call;

}

double bmi (){
    double bmi = weight/(length*length);
    this.bmi=bmi;
    return bmi;
    }

void checkHealth(){
    if(bmi >= MINIMUM_BMI && bmi<=MAXIMUM_BMI){
     status= "healthy";
    }
    else{
        status= "unhealthy";
    }

}


void printMethod(String status){
    out.printf("%s",status);
}

}
package BodyMassIndex;

import java.io.PrintStream;
import java.util.Scanner;
import ui.UIAuxiliaryMethods;

class BodyMassIndex {
PrintStream out;

BodyMassIndex() {
    out = new PrintStream(System.out);
}

void readFileIn() {
    Scanner fileScanner = 
UIAuxiliaryMethods.askUserForInput().getScanner();
    while (fileScanner.hasNext()) {
        String information = fileScanner.nextLine();
        readLine(information);
    }
}

void readLine(String information) {
    Scanner personScanner = new Scanner(information);
    while (personScanner.hasNext()) {
        String name = personScanner.next();
        String surname = personScanner.next();
        char gender = personScanner.next().charAt(0);
        double length = personScanner.nextDouble();
        int weight= personScanner.nextInt();
        Person een = new Person(length, weight, gender,name,surname);
        een.bmi();
        een.checkHealth();
        een.checkGender();
        out.printf("%s %s's bmi is %.2f, and is %s \n",een.call, 
een.surname,een.bmi,een.status);
        }

}

void start() {
    readFileIn();
}

public static void main(String[] argv) {
    new BodyMassIndex().start();
}
}

1 Ответ

1 голос
/ 01 ноября 2019

Язык сканера - проблема, или сканер UIAuxiliMethods каким-то образом меняет способ чтения строки.

В зависимости от того, на каком компьютере он запущен, и в качестве локали по умолчанию, могут появляться случайные ошибки. Например, НЕМЕЦКИЙ имеет «20,7» вместо «20,7».

Ваш код в том виде, в котором он существует, работает для меня. Но если я форсирую локаль, то могу получить то же исключение.

void readLine(String information) {
    Scanner personScanner = new Scanner(information);
    personScanner.useLocale(Locale.GERMAN);
    while (personScanner.hasNext()) {

Вам нужно форсировать конкретную локаль, которая соответствует содержимому файла. В вашем примере это работает.

    personScanner.useLocale(Locale.ENGLISH);
...