Пробуйте/ловите в Java

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

import java.util.*;
import java.io.*;
import java.math.*;
import javax.swing.*;

public class Main {
    public static void main(String[] args) {
        Boolean test = true;
        while (test == true) {
            try {
                double x, y;
                String operator;
                Scanner scan = new Scanner(System.in);
                Scanner scan_2 = new Scanner(System.in);
                Scanner ScanOperator = new Scanner(System.in);
                System.out.println(" Enter a double value: ");
                x = scan.nextDouble();
                System.out.println(" Enter another double value: ");
                y = scan_2.nextDouble();
                System.out.println(" Enter a operator for the operation you want to execute, or X if you want to quit: ");
                operator = ScanOperator.nextLine();
                if (operator.equals("x") || operator.equals("X")) {
                    test = false;
                    System.out.println("No calculation was made!!!");
                }
                System.out.println(Calculation(operator, x, y));
            } catch (NumberFormatException nfe) {
               JOptionPane.showMessageDialog(null,"Input must be a number.");
            }
        }
    }

    public static double Calculation(String operator, double x, double y) {
        double result = 0;
        double myAdd = 0;
        double mySub = 0;
        double myMult = 0;
        double myDiv = 0;
        double myPower = 0;
        double myMod = 0;

        if (operator.equals("+")) {
            myAdd = x + y;
            result = myAdd;
        } else if (operator.equals("-")) {
            mySub = x - y;
            result = mySub;
        } else if (operator.equals("*")) {
            myMult = x * y;
            result = myMult;
        } else if (operator.equals("/")) {
            myDiv = x / y;
            result = myDiv;
        } else if (operator.equals("^")) {
            myPower = Math.pow(x, y);
            result = myPower;
        } else if (operator.equals("%")) {
            myMod = x % y;
            result = myMod;
        } else {
        }

        return result;
    }
}
8
задан skaffman 8 May 2011 в 09:54
поделиться

7 ответов

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

Например, когда вы говорите:

 } catch (NumberFormatException nfe) {     
     JOptionPane.showMessageDialog(null,"Input must be a number.");
 }

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

 } catch (NumberFormatException nfe) {     
     JOptionPane.showMessageDialog(null,"Input must be a number.");
 }catch (Exception e){
     JOptionPane.showMessageDialog(null,"Generic exception caught");
 }

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

Тем не менее, с момента уловления исключения сама по себе нахмуривается, вы также можете сделать:

 } catch (NumberFormatException, ScannerException e) {     
     JOptionPane.showMessageDialog(null,"Input must be a number.");
 }

, чтобы поймать оба исключения в одном блоке.

21
ответ дан 5 December 2019 в 05:56
поделиться

В случае, если это полезно для кого-либо еще, я не смог сделать это точно, но нашел способ достичь конечного результата.

Поэтому вместо того, чтобы использовать редакционные опции для установки в поле формы значения readonly, я использовал событие beforeSunForm параметров add & edit для добавления и или удаления атрибута readonly.

Поэтому colmodel без опции readonly:

{name:'username', index:'username', width:155, editable:true}, 
{name:'password', index:'password', width:155, hidden:true, editable: true, edittype:'password', editrules:{edithidden:true}}, 

и опции navGrid edit & add, чтобы включить (для добавления) или выключить (для редактирования). Обратите внимание, что INPUT тэга ID будет значением поля name в colModel:

jQuery("#user-grid").jqGrid('navGrid','#user-grid-pager',
    { }, //options
    { // edit options
        beforeShowForm: function(frm) { 
            $('#username').attr('readonly','readonly'); 
        }
    }, 
    { // add options
        beforeShowForm: function(frm) { 
            $('#username').removeAttr('readonly'); 
        }
    }, 
    { }, // del options
    { } // search options
);

На стороне примечание, хотя я знаю (в соответствии с jquery дамп) функция «frm» arg является объектом jQuery, содержащий форму, я не смог получить селектор для успешного выбора потомка я хотел, поэтому я только что использовал идентификатор, который соответствует colModel имя.

-121--4818175-

Возможно, это было сделано для упрощения реализации. Если вы создаете класс, который наследуется пользователями класса, то у вас есть совершенно новый набор примеров использования, чтобы учесть в вашей конструкции. Что произойдет, если они сделают то или иное с X proptected field? Делая его окончательным, они могут сосредоточиться на обеспечении правильной работы общедоступного интерфейса и убедиться, что он надежен.

-121--3474500-

Почему бы просто не сделать:

String input = scan.nextLine();
if(!input.matches("\\d+")) { // regex for 1 or more digits
    System.err.println("Input must be at least 1 digit!");
    continue; // goes back to the top of the loop
}
double dbl = Double.valueOf(input);

К вашему сведению, действительный регекс для двойной точности будет [цифра] [.] [цифра] с [.] [цифра] является необязательным.

0
ответ дан 5 December 2019 в 05:56
поделиться

Вы ловите неправильный исключение.

1
ответ дан 5 December 2019 в 05:56
поделиться

Вы пытаетесь поймать invermatexception. Вам нужно добавить оператор для Scannerexception, так как он отличается от Informatexception.

4
ответ дан 5 December 2019 в 05:56
поделиться

Иногда я тоже виновен в этой практике, сохраняя интервал времени в объекте даты и используя getTime (), как предложено notnoop.

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

-121--2364341-

Код не выдаст NumberFormatException . Вместо этого следует перехватить InputMismatchException .

Если смотреть на nextDouble , в Scanner , кажется, что код Scanner обрабатывает NumberFormatException для вас, а затем выдает другой тип исключения:

из java.util.Scanner :

public double nextDouble() {
    // Check cached result
    if ((typeCache != null) && (typeCache instanceof Double)) {
        double val = ((Double)typeCache).doubleValue();
        useTypeCache();
        return val;
    }
    setRadix(10);
    clearCaches();
    // Search for next float
    try {
        return Double.parseDouble(processFloatToken(next(floatPattern())));
    } catch (NumberFormatException nfe) {
        position = matcher.start(); // don't skip bad token
        throw new InputMismatchException(nfe.getMessage());
    }
} 

При возникновении такой проблемы Это отличный ресурс.

Также обратите внимание, что в JDK отсутствует ScannerException .

-121--3456780-

Просто поймайте InputMismatchException вместо NumberFormatException , и все работает нормально.

0
ответ дан 5 December 2019 в 05:56
поделиться

Вам нужно поймать ScannerException или что-то вроде этого.

В этом коде перехватывается только NumberFormatException .

Попробуйте что-нибудь вроде этого:

    try {
       ...
    } catch (NumberFormatException, ScannerException exception) {
       JOptionPane.showMessageDialog(null,"Input must be a number.");
    }
2
ответ дан 5 December 2019 в 05:56
поделиться

Ваш код не будет бросать NumberFormatException . Вместо этого следует поймать InputMismatchException.

Глядя на nextDouble, в Scanner, кажется, что код Scanner обрабатывает NumberFormatException для вас, а затем бросает другой тип исключения:

из java.util.Scanner:

public double nextDouble() {
    // Check cached result
    if ((typeCache != null) && (typeCache instanceof Double)) {
        double val = ((Double)typeCache).doubleValue();
        useTypeCache();
        return val;
    }
    setRadix(10);
    clearCaches();
    // Search for next float
    try {
        return Double.parseDouble(processFloatToken(next(floatPattern())));
    } catch (NumberFormatException nfe) {
        position = matcher.start(); // don't skip bad token
        throw new InputMismatchException(nfe.getMessage());
    }
} 

Когда вы сталкиваетесь с подобной проблемой, я рекомендую просмотреть источник Java в качестве первой остановки. Это отличный ресурс.

Также обратите внимание, что в JDK нет ScannerException.

0
ответ дан 5 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: