Если ... не int { - PullRequest
       28

Если ... не int {

1 голос
/ 22 октября 2011

Я пытаюсь заставить программу распознавать, если int не введен.

Я видел все из:

   if  (v % 1) 

до

    parseInt();

но они не работают на меня.

import java.util.Scanner;

public class LinearSlopeFinder {
    public static void main(String[]args){
        double x1, y1, x2, y2, n1, equation, constant = 0 ;
        double slope, slope1, slopeAns;
        Scanner myScanner = new Scanner(System.in);

        System.out.print("    What is the first set of cordinants? example: x,y ... ");
        String coordinate1 = myScanner.nextLine();

        //below is what i am referring to 


        if (coordinate1 != int ){    // if it is a double or String 
            System.out.println("Sorry, you must use whole numbers.What is the first set of cordinants? example: x,y ... ");
            System.out.print("    What is the first set of cordinants? example: x,y ... ");
            String coordinate1 = myScanner.nextLine();
        }

Ответы [ 6 ]

6 голосов
/ 22 октября 2011

Проверка, что значение является таким примитивом, не сработает. Java не сможет сравнивать значение с типом таким образом.

Один из способов - воспользоваться статической функцией Integer.parseInt(String s), чтобы проверить, было ли введено соответствующее значение типа int. Обратите внимание, что он выбрасывает NumberFormatException. Если вы можете воспользоваться этим фактом, вы можете узнать, было ли предоставлено целое число из функции.

try {
   //Attempt the parse here
} catch (...) {
   //Not a proper integer
}

Второй метод (поскольку вы уже пользуетесь классом Scanner) - это использование Scanner методов hasNextInt() и nextInt(), чтобы определить:

  1. У Scanner есть новое целое число в потоке
  2. Получить фактическое целочисленное значение из потока

Пример использования:

if (myScanner.hasNextInt()) {
   int totalAmount = myScanner.nextInt();
   // do stuff here
} else {
   //Int not provided
}

Как вы упомянули в своем обновлении, все в порядке, если ввод от Scanner равен , разделенному пробелами. По умолчанию сканер разделяет значения в потоке пробелами. Что происходит, когда у вас есть другой разделитель (например, "," или "//" и т. Д.), Который логически разделяет два уникальных значения в потоке?

Решением этой проблемы является изменение разделителя, используемого Scanner. Существует метод с именем useDelimiter(String pattern), который позволяет указать, как значения будут логически разделяться в потоке. Это очень полезно для случаев, подобных тем, с которыми вы работаете (или для случаев, когда пробелы не разделяют значения).

Использование будет выглядеть примерно так:

Scanner myScanner = ...; # Get this how you normally would
String delimiter = ...;  # Decide what the separator will be
myScanner.useDelimiter(delimiter); # Tell the Scanner to use this separator

Есть хороший пример этого в API Scanner (см. Первую ссылку на Scanner, которую я включил для этого примера), который описывает, как это используется. Я предлагаю проверить это, и это будет очень приятно для вас (я верю).

2 голосов
/ 22 октября 2011

Еще одно решение, так что у вас был выбор: в JLS §3.10.1 вы можете прочитать, каким может быть целое число. Поместив определение в форму регулярного выражения, вы получите:

// input s
if (s.matches("(?i)[+-]?(0|[1-9][0-9]*|0[x][0-9a-f]+|0[0-7]+)L?")) { /* do something */}

Недостатком будет то, что вы добавите подробное определение числа в своем коде - Java может сделать это для вас. Бонус, однако, заключается в том, что ваш случай с 2,3 легко решается:

String intLiteral = "[+-]?(0|[1-9][0-9]*|0[x][0-9a-f]+|0[0-7]+)L?";
// input s
if (s.matches("(?i)" + intLiteral + "," + intLiteral)) { /* do something */}

(все будет не так просто, потому что вы, вероятно, тоже захотите строки вроде 2, 3 valid, но я оставлю это с вами.)

Возвращаясь к часто используемому решению и вашему комментарию о 2,3, вы должны привыкнуть разделять проблемы: вы уже знаете несколько способов проверить, содержит ли строка целое число или нет. Теперь вы можете оставить эту проблему в покое и обратиться к запятым:

    String s = "2,3";
    String[] parts = s.split(","); // here we deal with commas

    try {
        // now when we have parts, deal with parts separately
        System.out.println("First:  " + Integer.parseInt(parts[0]));
        System.out.println("Second: " + Integer.parseInt(parts[1]));
    } catch (NumberFormatException e) {
        System.out.println("There was a problem, you know: " + e.getMessage());
    }
1 голос
/ 22 октября 2011

Вы можете использовать Integer.parseInt(yourInt), но тогда вам нужно отловить ошибку, которая выдается, если вы не получили целое число, например:

try {
  Integer.parseInt(yourInt);
}
catch (NumberFormatException e) {
  // do something that indicates to the user that an int was not given.
}
0 голосов
/ 02 января 2015

Один метод, который вы можете попробовать использовать, это новый метод. Вот что я использую для получения целочисленных входных данных:

public static int getIntInput(Scanner s) { // Just put your scanner into here so that the method can read inputs without creating a new scanner each time
    System.out.print("Enter int here: ");
    try {
        return Integer.parseInt(s.nextLine());
    } catch (NumberFormatException e) {
        System.out.println("You must enter a valid Integer literal.");
        return getIntInput(s);            // Note that this line just repeats the try statement all over again.
    }

Если входное значение является целым числом, оно возвращает int; в противном случае он пытается снова. Примечание: добавьте счетчик, чтобы код не ломался, если кто-то установит свою ланч-сумку на вашу клавишу ввода.

0 голосов
/ 22 октября 2011

Используйте эту модель:

Integer result = null;
try {
    result = Integer.valueOf(input);
} catch (NumberFormatException e) {}
if (result != null) {
    // An integer was entered
}

Integer.valueOf сгенерирует исключение для чисел с десятичными значениями, поэтому у вас не должно возникнуть никаких проблем. Я использую класс Integer против int, чтобы его можно было установить на ноль. Использование -1 означает, что нельзя ввести -1.

0 голосов
/ 22 октября 2011
if (coordinate1 != int)

не будет работать, потому что вы сравниваете значение с типом.Этот код даже не должен компилироваться.

Использование:

try {
    int integer = Integer.parseInt(value);
} catch (NumbumberFormatException e) {
    // Not an integer
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...