Почему я получаю сообщение об ошибке при проверке, может ли строка быть двойной [дубликатом]

Привет, ребята, я довольно новичок в кодировании, но один из моих проектов - проверить, можно ли разобрать строку на двойную. Постоянно выдает ошибку при попытке запустить программу.

Вот код:

        public static void main(String[] args) {
            SimpleReader in = new SimpleReader1L();
            SimpleWriter out = new SimpleWriter1L();

          // Constant entered in by user as a string
            out.println("Welcome to constant approximator");
            out.println("Please enter in a constant to be estimated");
            String realConstant = in.nextLine();

        //Double variable created in order to reassign later
            double test = 0;

       //FormatChecker class and canParseDouble verifies if the string is truly a double. boolean method.
            FormatChecker.canParseDouble(realConstant);
       //Test reassign and converts
            test = Double.parseDouble(realConstant);
            out.print(test);
            in.close();
            out.close();
        }

    }

Вот ошибка:

Exception in thread "main" java.lang.NumberFormatException: For input string: "pi"
    at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
    at sun.misc.FloatingDecimal.parseDouble(Unknown Source)
    at java.lang.Double.parseDouble(Unknown Source)
    at ABCDGuesser1Test.main(ABCDGuesser1Test.java:36)

person trumph15bx    schedule 27.05.2018    source источник
comment
Возможно, вам не следует игнорировать значение, возвращаемое FormatChecker.canParseDouble(realConstant).   -  person Eran    schedule 27.05.2018
comment
Как пи является двойным? Как?   -  person Mạnh Quyết Nguyễn    schedule 27.05.2018
comment
Разве входная строка не должна состоять только из чисел/цифр 0-9 и .?   -  person piepi    schedule 27.05.2018
comment
stackoverflow.com/q/8285982/5192105 попробуйте это.   -  person Sachin Bahukhandi    schedule 27.05.2018
comment
Вещь называется Добро пожаловать в постоянный аппроксиматор - кажется, основная проблема заключается в том, что он запрашивает постоянное имя (например, пи), а затем пытается разобрать его как двойное - вместо этого он должен попытаться каким-то образом аппроксимировать PI.   -  person Erwin Bolwidt    schedule 27.05.2018
comment
Не редактируйте свой вопрос, чтобы сделать существующие ответы недействительными.   -  person    schedule 27.05.2018


Ответы (3)


Это происходит потому, что вы вводите pi, который не распознается как константа π (пи). То, что вы набрали, было строкой, и эти символы не могут быть преобразованы в число.

Если вы хотите ввести любое число, включая специальную константу, такую ​​как pi, вы должны сначала проверить, является ли ввод числом или строкой. Если это строка, вы можете попытаться сопоставить ее с определенной константой, такой как π или e, и использовать их определенное значение в Java, например Math.PI.

person Nikolas Charalambidis    schedule 27.05.2018
comment
Я думаю, что настоящая проблема не в проверке возвращаемого значения из canParseDouble. - person M. le Rutte; 27.05.2018
comment
М. ле Рютте: Как это решает проблему, когда в качестве входных данных вводится pi? - person Nikolas Charalambidis; 27.05.2018
comment
@ M.leRutte, не зная содержимого метода canParseDouble, это всего лишь предположение. Это также может разрешить pi|e|sqrt2. Аппроксиматор констант имени фактически предполагает это. - person Erwin Bolwidt; 27.05.2018

Вы должны использовать результат canParseDouble(), а не просто вызывать его. Что-то вроде этого, я думаю:

if (FormatChecker.canParseDouble(realConstant)) {
   test = Double.parseDouble(realConstant);
   out.println(test);
} 
person Mike B    schedule 27.05.2018

Как ты говоришь:

//FormatChecker class and canParseDouble verifies if the string is truly a double. boolean method.
        FormatChecker.canParseDouble(realConstant);

Вы знаете, что эта строка вызывает логический метод и возвращает либо true, либо false. Однако вы не используете это возвращаемое значение. Если да, то какой смысл даже вызывать функцию, верно?

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

Затем вы должны использовать оператор if, например:

if (FormatChecker.canParseDouble(realConstant)) {
    test = Double.parseDouble(realConstant);
    out.println(test);
} 

Кроме того, я не думаю, что вы должны ожидать, что ввод «пи» вернет двойное значение!

person ChanceVI    schedule 27.05.2018