0

我在 MySQL 中创建了一个包含一个表的数据库:

CREATE DATABASE iac_enrollment_system;

USE iac_enrollment_system;

CREATE TABLE course(
    course_code CHAR(7),
    course_desc VARCHAR(255) NOT NULL,
    course_chair VARCHAR(255),
    PRIMARY KEY(course_code)
);

我正在使用此 Java 代码将记录插入表中:

// Insert multiple records with user input into a table
// With separate methods

import java.sql.*;
import java.util.*;

class InsertSQL3 {
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost:3306/iac_enrollment_system";
static final String USER = "root";
static final String PASS = "1234";

static int no_of_records;
static String[] saCourseCode = new String[no_of_records];
static String[] saCourseDesc = new String[no_of_records];
static String[] saCourseChair = new String[no_of_records];

static Connection conn = null;
static Statement stmt = null;

static void getInput() {
    Scanner scn = new Scanner(System.in);
    
    // Get number of records
    System.out.print("How many records do you want to insert? ");
    no_of_records = scn.nextInt();
    scn.nextLine();
    
    // Get values
    for(int i = 0; i < no_of_records; i++) {
        System.out.print("\nEnter course code: ");
        saCourseCode[i] = scn.nextLine();

        System.out.print("Enter course description: ");
        saCourseDesc[i] = scn.nextLine();

        System.out.print("Enter course chair: ");
        saCourseChair[i] = scn.nextLine();
    }
}

static void executeQuery() {
    System.out.print("\nInserting records into table...");
    
    try {
        stmt = conn.createStatement();

        for(int i = 0; i < no_of_records; i++) {
            String sql = "INSERT INTO course(course_code, course_desc, course_chair)" +
                "VALUES(?, ?, ?)";

            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, saCourseCode[i]);
            ps.setString(2, saCourseDesc[i]);
            ps.setString(3, saCourseChair[i]);
            ps.executeUpdate();
        }

    } catch(SQLException se) {
        se.printStackTrace();
    }
        
    System.out.println(" SUCCESS!\n");
}

public static void main(String[] args) {
    try {
        Class.forName("com.mysql.jdbc.Driver");

        System.out.print("\nConnecting to database...");
        conn = DriverManager.getConnection(DB_URL, USER, PASS);
        System.out.println(" SUCCESS!\n");
        
        getInput();
        executeQuery();

    } catch(SQLException se) {
        se.printStackTrace();
    } catch(Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if(stmt != null)
                conn.close();
        } catch(SQLException se) {
        }
        try {
            if(conn != null)
                conn.close();
        } catch(SQLException se) {
            se.printStackTrace();
        }
    }
    System.out.println("Thank you for your patronage!");
  }
}

在我输入课程代码后,例如BSCS-SE,它返回此错误: 越界

为什么会越界?非常感谢您的帮助。谢谢你。

4

4 回答 4

1

0数字原语在 Java 中具有默认值,因此该数组saCourseCode是一个大小为零的数组,不能分配任何值。接受后初始化数组no_of_records

no_of_records = scn.nextInt();
saCourseCode = new String[no_of_records];

这适用于数组saCourseDescsaCourseChair也适用于

编辑:

这是用于初始化数组的模板。省略了一些代码,但您应该能够弄清楚其余代码:

class InsertSQL3 {
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost:3306/iac_enrollment_system";
    static final String USER = "root";
    static final String PASS = "***";

    private int noOfRecords;
    private String[] saCourseCode;
    private String[] saCourseDesc;
    private String[] saCourseChair;

    private Connection conn = null;
    private Statement stmt = null;

    private Scanner scn;

    public InsertSQL3() {
        scn = new Scanner(System.in);
    }

    private void initConnection() {
       ...
    }

    private void getInput() {

        // Get number of records
        System.out.print("How many records do you want to insert? ");
        noOfRecords = Integer.parseInt(scn.nextLine());

        saCourseCode = new String[noOfRecords];
        saCourseDesc = new String[noOfRecords];
        saCourseChair = new String[noOfRecords];

        ...
    }

    private void executeQuery() {
         ...
    }



    public static void main(String[] args) {
        InsertSQL3 insertApp = new InsertSQL3();
        insertApp.initConnection();
        insertApp.getInput();
        insertApp.executeQuery();

        System.out.println("Thank you for your patronage!");
    }
}
于 2013-08-18T09:14:46.223 回答
1

您的数组将始终为零长度:

static int no_of_records;
static String[] saCourseCode = new String[no_of_records];
static String[] saCourseDesc = new String[no_of_records];
static String[] saCourseChair = new String[no_of_records];

数组立即创建,长度为 from no_of_records,这当然0是因为您没有为其分配任何内容,Java 将默认值设置为intto 0

如果编译器没有警告您,我会感到非常惊讶。

只有在知道有多少条记录之后,您才想创建数组。

另外:我强烈建议不要为此使用static变量。这是您应该包含在实例中的那种东西。

于 2013-08-18T09:15:16.050 回答
1

Astatic int最初是0直到它被分配一个值。您需要在了解它们的大小后创建数组,即:

static void getInput() {
    Scanner scn = new Scanner(System.in);

    // Get number of records
    System.out.print("How many records do you want to insert? ");
    no_of_records = scn.nextInt();
    scn.nextLine();

    // Now we know how many records we need to handle!
    String[] saCourseCode = new String[no_of_records];
    String[] saCourseDesc = new String[no_of_records];
    String[] saCourseChair = new String[no_of_records];

    // Get values
    for(int i = 0; i < no_of_records; i++) {
于 2013-08-18T09:19:46.550 回答
0
static int no_of_records;
static String[] saCourseCode = new String[no_of_records];

相当于

static int no_of_records = 0;
static String[] saCourseCode = new String[no_of_records];

因此,所有数组的长度均为 0。no_of_records仅在getInput()方法中初始化之后。初始化后初始化数组no_of_records

请尊重 Java 命名约定。

于 2013-08-18T09:17:11.727 回答