#java #sqlite
#java #sqlite
Вопрос:
Банковский класс, вызывающий класс Atm.Класс machine содержит метод start machine . Здесь и далее цикл будет выполняться вечно, вызывая требуемые методы из других классов, которые не имеют отношения к делу. Метод create table должен вызываться только один раз.После проверки PIN-кода программа запускается бесконечно
import java.util.Scanner;
public class Bank {
final static int PIN = 5423;//pin to start the ATM operations
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Enter the PIN to start the machine");
for(int i = 3; i >= 1;--i) {
int n = scanner.nextInt();
if(n == PIN) {//if pin was correct , start the ATM
Atm atm = new Atm();
atm.startMachine();
break;
}
else if(i > 1)
System.out.println("Incorrect PIN. You have " (i-1) " tries remaining");
else {
System.out.println("Tries exhausted. Contact the main office.");
break;
}
}
scanner.close();
}
}
Класс Atm, который имеет метод start machine
class Atm {//class for functioning of ATM
Scanner scan;
protected String load;//loading time
protected int cashAvailable = 2000000;//initial cash available
static Database database;
Atm(){//constructor to initialize fields
scan = new Scanner(System.in);
load = "00:00";//the loading time at midnight
database = new Database();
database.createTable();//call the database class
}
public void startMachine(){//start the machine
Machine machine = new Machine();
machine.start();//call the start method
}
}
И класс machine
public void start() {//method to start the machine
Withdraw withdraw = new Withdraw();//withdraw object
Deposit deposit = new Deposit();//deposit object
while(true) {//infinite loop for functioning of machine
String currentTime = new SimpleDateFormat("HH:mm").format(new Date());//get the current time
boolean isLoadingTime = currentTime.equals(load);//if is loading time
if(isLoadingTime) {//if yes, the call load method
load();//method to load the cash
}
//show the welcome screen at every iteration
System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
System.out.println();
System.out.println("Welcome to National Bank");
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
Date date = new Date();
System.out.print(formatter.format(date) " ");
System.out.println(LocalDateTime.now().getDayOfWeek());
System.out.println("Press 1 to view your current balance");
System.out.println("Press 2 to withdraw cash");
System.out.println("Press 3 to deposit funds");
System.out.println();
System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
while(true) {
int enter_num = scan.nextInt();//get the preferred choice
if(enter_num == 1) {
currentBalance();//method to show current balance
break;
}
else if(enter_num == 2) {
withdraw.debit();//method to withdraw cash
break;
}
else if(enter_num == 3) {
deposit.giveCash();//method to deposit cash
break;
}
else
break;//if not valid option
}
}
}
Комментарии:
1. Опубликуйте остальную часть кода, который вызывает эти методы.
2. Я не думаю, что это необходимо, а также это огромно. Это может быть беспорядок. Вы уверены? Я опубликовал один метод. Пожалуйста, проверьте и помогите @forpas
Ответ №1:
Очевидными ошибками в вашем коде в update()
методе являются запятая, после SET Balance = ?
которой вы должны удалить, а также изменить индексы stmt.setInt()
to 1
для balance
и 2
для accountNo
, потому что вы передаете 2 параметра с этим порядком в вашем UPDATE
заявлении:
String change = "UPDATE accounts SET Balance = ? WHERE AccountNumber = ?";
try {
PreparedStatement stmt = conn.prepareStatement(change);
stmt.setInt(1,balance);
stmt.setInt(2,accountNo);
.............................
Кроме того, сообщение об ошибке:
Прерывание из-за нарушения ограничений (сбой УНИКАЛЬНОГО ограничения: учетные записи.Номер учетной записи)
означает, что вы пытаетесь вставить в таблицу номер учетной записи, который уже существует в таблице, и это недопустимо, поскольку столбец AccountNumber
является первичным ключом таблицы, поэтому он уникален.
Кроме того, внутри createTable()
что такое sc
? Это результирующий набор?
Если да, то что вы пытаетесь сделать? Вы пытаетесь перебирать строки таблицы?
Таблица только что создана и она пуста.
Из опубликованного вами кода я не понимаю, почему вы получаете 4 раза сообщение «Создана новая база данных», потому что я не знаю, как вы вызываете метод createTable()
.
Комментарии:
1. Спасибо. ошибка уникального ограничения устранена. Для оставшейся части я просто отредактирую вопрос. Также balance на самом деле является 3-й записью в записи, а pin-код — 2-й. итак, я должен обновлять только 3-ю запись, но после удаления запятой я получаю error: Exception в потоке «main» java.lang. Исключение ArrayIndexOutOfBoundsException: индекс 2 выходит за пределы длины 2 @forpas
2. Я не понимаю. Посмотрите, в таблице запись 1 — номер учетной записи (первичный ключ), 2-pin, 3-баланс, 4-сбережения. После того, как произойдет транзакция, я хочу обновить только баланс, который является 3-й записью, соответствующей ключу (номеру счета). Итак, как еще это сделать? @forpas
3. Итак, что я сделал не так в своем заявлении об обновлении? Ключ — это номер учетной записи, поэтому он должен быть после ключевого слова WHERE. Как мне обновить запись, соответствующую этому ключу, если мой метод неверен?
4. Я добавил основной класс вызова конструктора
5. Да. Я думал, что вы не сможете мне помочь в этом случае, потому что код слишком большой для отладки для кого-то другого, подобного этому. Тем не менее, спасибо за ваше время и терпение.