Ошибка при использовании базы данных в Java с использованием SQLite

#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. Да. Я думал, что вы не сможете мне помочь в этом случае, потому что код слишком большой для отладки для кого-то другого, подобного этому. Тем не менее, спасибо за ваше время и терпение.