Кто-то мог дать мне подсказку, почему это пытается поймать, не работает? Это выдает исключение сканера вместо того, чтобы печатать сообщение, которое я ожидаю.
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;
}
}
Просто, программа бросает 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.");
}
, чтобы поймать оба исключения в одном блоке.
В случае, если это полезно для кого-либо еще, я не смог сделать это точно, но нашел способ достичь конечного результата.
Поэтому вместо того, чтобы использовать редакционные опции для установки в поле формы значения 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);
К вашему сведению, действительный регекс для двойной точности будет [цифра] [.] [цифра] с [.] [цифра] является необязательным.
Вы пытаетесь поймать invermatexception. Вам нужно добавить оператор для Scannerexception, так как он отличается от Informatexception.
Иногда я тоже виновен в этой практике, сохраняя интервал времени в объекте даты и используя 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
.
Просто поймайте InputMismatchException
вместо NumberFormatException
, и все работает нормально.
Вам нужно поймать ScannerException или что-то вроде этого.
В этом коде перехватывается только NumberFormatException .
Попробуйте что-нибудь вроде этого:
try {
...
} catch (NumberFormatException, ScannerException exception) {
JOptionPane.showMessageDialog(null,"Input must be a number.");
}
Ваш код не будет бросать 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
.