Я плохо знаком с Java, так простите вопрос о новичке.
Я создал приложение колебания, которое в основном имеет три входных строки в JTextFields: loanAmount, процентная ставка и loanYears и единственная кнопка отправки с EventAction
.
Я пытаюсь использовать java.util.Scanner
проанализировать вход к типам примитивов, которые я могу использовать в вычислениях.
Я получаю ошибку в NetBeans, указывающем, что мои переменные не распознаны? если я не звоню System.in
?
private void submitButtonActionPerformed(java.awt.event.ActionEvent evt) {
Scanner keyInput = new Scanner(System.in);
while (true)
try{
double amount = keyInput.nextDouble(loanAmount.getText());
double interest = keyInput.nextDouble(interestRate.getText());
int years = keyInput.nextInt(loanYears.getText());
} catch (NumberFormatException nfe){
}
}
Не бойтесь задавать более простые вопросы, мы их получаем постоянно. На самом деле, если бы не простые вопросы, я бы никогда ни на что не ответил.
Я сразу вижу три проблемы в вашем коде:
Вы перехватываете исключение, но затем отбрасываете его. Бывают случаи, когда вы хотите не предпринимать никаких действий в ответ на исключение с точки зрения пользователя, но как программист вы захотите знать. Попробуйте сказать nfe.printStackTrace (System.err);
Сканер - это не то, что вы ищете. Double.valueOf (..) было бы более прямым.
Теперь, что касается вашей реальной проблемы: Ваши три переменные выходят из области видимости в конце блока try
. Попробуйте объявить их там, где вы объявляете KeyInput.
private void submitButtonActionPerformed(java.awt.event.ActionEvent evt) {
double amount, interest;
int years;
while (true) {
try {
amount = Double.valueOf(loanAmount.getText());
interest = Double.valueOf(interestRate.getText());
years = Integer.valueOf(loanYears.getText());
} catch (NumberFormatException nfe){
if (DEBUG) nfe.printStackTrace(System.err);
return;
}
}
// Your values of amount, interest and years will be available here.
// Past this last curley brace, however, they will go out of scope.
// If you want them to stick around for as long as the new object,
// define them as class fields.
}
Нет, не стоит ;) Сканер читает данные из потока, а System.in - это поток, который читает байты из консоли, а не из компонентов свинга.
Идея здесь в том, чтобы разобрать String в текстовом поле:
private void submitButtonActionPerformed(java.awt.event.ActionEvent evt) {
try {
double amount = Double.parseDouble(loanAmount.getText());
double interest = Double.parseDouble(interestRate.getText());
int years = Integer.parseInt(loanYears.getText());
} catch (NumberFormatException nfe){
}
}
Scanner предназначен для командной строки. Вам нужно получить доступ к полю ввода, получить его значение и превратить его в int.
Попробуйте так:
private void submitButtonActionPerformed(java.awt.event.ActionEvent evt) {
double amount = Double.valueof(loanAmount.getText());
double interest = Double.valueof(interestRate.getText());
int years = Double.valueof(loanYears.getText());
}