Сканер Java выдает InputMismatchException при попытке прочитать nextDouble()

Я пытаюсь прочитать целое число и два двойных числа из текстового файла. Я написал более короткую демонстрацию моей проблемы.

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        int q = 0;
        double w = 0, e = 0;
        Scanner s = null;
        try {
            s = new Scanner(new File(args[0]));
            while(s.hasNext()) {
                q = s.nextInt();
                w = s.nextDouble();
                e = s.nextDouble();
            }
            System.out.println("1: " + q + "\n2: " + w + "\n3: " + e);
        } catch(FileNotFoundException e1) {
            e1.printStackTrace();
            System.out.println(e1.getMessage());
        } finally {
            if(s != null) {
                s.close();
            }
        }
    }
}

Это дает мне

    Exception in thread "main" java.util.InputMismatchException
        at java.util.Scanner.throwFor(Unknown Source)
        at java.util.Scanner.next(Unknown Source)
        at java.util.Scanner.nextDouble(Unknown Source)
        at Test.main(Test.java:14)

Я думаю, что у моего Сканера возникла проблема с чтением двойника, но я не могу понять, почему.

Мой текстовый файл содержит:

    3000 30.3 10.4

person koin    schedule 10.01.2016    source источник
comment
Вы пробовали, возможно, указать значение? Так, например, w = (double) s.nextDouble();   -  person Bryan Herrera    schedule 10.01.2016
comment
@BryanHerrera Scanner.nextDouble должен просто вернуть double. Нет необходимости бросать. И даже если бы он не вернул double, это привело бы к предупреждению компилятора из-за присвоения переменной недопустимого типа, а не исключения времени выполнения.   -  person Arc676    schedule 10.01.2016
comment
s.useLocal(Язык.США); исправил это для меня. Поскольку Java работает с точками, я никогда не думал об этом :/ Думаю, локальным по умолчанию для меня тогда была Германия.   -  person koin    schedule 10.01.2016
comment
В файле числа хранятся в виде строк. Итак, сначала используйте метод подстроки, используя пробел в качестве разделителя, чтобы получить каждое значение, а затем приведите его к целому двойному числу или какому-либо другому, используя методы из библиотеки String.   -  person SeahawksRdaBest    schedule 10.01.2016
comment
@koin Просто из любопытства, для чего нужен Locale? это должно меняться в зависимости от страны или что-то в этом роде?   -  person Bryan Herrera    schedule 10.01.2016
comment
@BryanHerrera Я думаю, что в большинстве европейских государств они используют запятую в качестве десятичного разделителя, и мой текстовый файл содержал точки. Итак, Locale.US исправил это :)   -  person koin    schedule 10.01.2016
comment
@BryanHerrera В некоторых европейских странах (например, в Италии и, возможно, в Германии) каждая третья цифра отделяется точкой, а десятичные дроби разделяются запятыми. В английском языке применяется обратное. Scanner использовал неправильную локаль, поэтому он искал запятые в качестве разделителей для десятичных знаков. koin: вы можете ответить на свой вопрос, чтобы показать, что проблема решена   -  person Arc676    schedule 10.01.2016
comment
@ Arc676 О, понятно, спасибо за информацию!   -  person Bryan Herrera    schedule 11.01.2016