只有在触发事件的时候,才出错Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsExcept图书表
CREATE TABLE [dbo].[BOOK](
[BNO] [int] NOT NULL,
[NAME] [char](20) NULL,
[TYPE] [char](10) NULL,
[ISBORROW] [char](2) NULL,
[RNO] [int] NULL,
CONSTRAINT [PK_BOOK] PRIMARY KEY CLUSTERED
)
package bookstore;import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;public class bookDialog extends JDialog implements ActionListener{
JLabel jLabel1;
JButton jButton1;
JTextField jTextField1;
Box box1;
JPanel jPanel1;
JTable table;
Object a[][];
Object name[] = {"图书编号","书名","类别","是否借出","借阅人编号"};
Connection con;
Statement sql;
ResultSet rs;
bookDialog() {
jLabel1 = new JLabel("图书编号(回车确认):");
jTextField1 = new JTextField(10);
jButton1 = new JButton("查询全部");
a = new Object[1][5];
table = new JTable(a,name);
box1 = Box.createHorizontalBox();
jPanel1 = new JPanel(new FlowLayout(FlowLayout.CENTER));
box1.add(jLabel1);
box1.add(Box.createHorizontalStrut(40));
box1.add(jTextField1);
box1.add(Box.createHorizontalStrut(40));
box1.add(jButton1);
jPanel1.add(box1);
add(jPanel1,BorderLayout.SOUTH);
add(new JScrollPane(table),BorderLayout.CENTER);
jTextField1.addActionListener(this);
jButton1.addActionListener(this);
setBounds(200, 250, 435, 300);
} @Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == jTextField1) {
try {
String s = jTextField1.getText().trim();
int num = Integer.parseInt(s);
con = DriverManager.getConnection("jdbc:odbc:bookstore","","");
sql = con.createStatement();
rs = sql.executeQuery("SELECT * FROM book WHERE bno = '"+num+"' ");
if (!rs.next()) {
JOptionPane.showMessageDialog(this, "学号卜存在","提示",JOptionPane.WARNING_MESSAGE);
}
else {
try {
a[0][0] = rs.getInt(1);
a[0][1] = rs.getString(2);
a[0][2] = rs.getString(3);
a[0][3] = rs.getString(4);
a[0][4] = rs.getInt(5);
table.repaint();
}
catch (SQLException e2) {e2.printStackTrace();}
con.close();
}
}
catch (SQLException ee) {System.out.println(ee);}
table = new JTable(a,name);
getContentPane().removeAll();
add(jPanel1,BorderLayout.SOUTH);
add(new JScrollPane(table),BorderLayout.CENTER);
}
if (e.getSource() == jButton1) {
try {
con = DriverManager.getConnection("jdbc:odbc:bookstore","","");
sql = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs = sql.executeQuery("SELECT * FROM book");
int lastnum = rs.getRow();
a= new Object[lastnum][5];
int k = 0;
rs.beforeFirst();
while (rs.next()) {
try {
a[k][0] = rs.getInt(1);
a[k][1] = rs.getString(2);
a[k][2] = rs.getString(3);
a[k][3] = rs.getString(4);
a[k][4] = rs.getInt(5);
k++;
}
catch (SQLException e2) {e2.printStackTrace();}
}
con.close();
} catch (SQLException ee) {
System.out.println(ee);
}
table = new JTable(a,name);
getContentPane().removeAll();
add(jPanel1,BorderLayout.SOUTH);
add(new JScrollPane(table),BorderLayout.CENTER);
}
}
}
CREATE TABLE [dbo].[BOOK](
[BNO] [int] NOT NULL,
[NAME] [char](20) NULL,
[TYPE] [char](10) NULL,
[ISBORROW] [char](2) NULL,
[RNO] [int] NULL,
CONSTRAINT [PK_BOOK] PRIMARY KEY CLUSTERED
)
package bookstore;import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;public class bookDialog extends JDialog implements ActionListener{
JLabel jLabel1;
JButton jButton1;
JTextField jTextField1;
Box box1;
JPanel jPanel1;
JTable table;
Object a[][];
Object name[] = {"图书编号","书名","类别","是否借出","借阅人编号"};
Connection con;
Statement sql;
ResultSet rs;
bookDialog() {
jLabel1 = new JLabel("图书编号(回车确认):");
jTextField1 = new JTextField(10);
jButton1 = new JButton("查询全部");
a = new Object[1][5];
table = new JTable(a,name);
box1 = Box.createHorizontalBox();
jPanel1 = new JPanel(new FlowLayout(FlowLayout.CENTER));
box1.add(jLabel1);
box1.add(Box.createHorizontalStrut(40));
box1.add(jTextField1);
box1.add(Box.createHorizontalStrut(40));
box1.add(jButton1);
jPanel1.add(box1);
add(jPanel1,BorderLayout.SOUTH);
add(new JScrollPane(table),BorderLayout.CENTER);
jTextField1.addActionListener(this);
jButton1.addActionListener(this);
setBounds(200, 250, 435, 300);
} @Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == jTextField1) {
try {
String s = jTextField1.getText().trim();
int num = Integer.parseInt(s);
con = DriverManager.getConnection("jdbc:odbc:bookstore","","");
sql = con.createStatement();
rs = sql.executeQuery("SELECT * FROM book WHERE bno = '"+num+"' ");
if (!rs.next()) {
JOptionPane.showMessageDialog(this, "学号卜存在","提示",JOptionPane.WARNING_MESSAGE);
}
else {
try {
a[0][0] = rs.getInt(1);
a[0][1] = rs.getString(2);
a[0][2] = rs.getString(3);
a[0][3] = rs.getString(4);
a[0][4] = rs.getInt(5);
table.repaint();
}
catch (SQLException e2) {e2.printStackTrace();}
con.close();
}
}
catch (SQLException ee) {System.out.println(ee);}
table = new JTable(a,name);
getContentPane().removeAll();
add(jPanel1,BorderLayout.SOUTH);
add(new JScrollPane(table),BorderLayout.CENTER);
}
if (e.getSource() == jButton1) {
try {
con = DriverManager.getConnection("jdbc:odbc:bookstore","","");
sql = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs = sql.executeQuery("SELECT * FROM book");
int lastnum = rs.getRow();
a= new Object[lastnum][5];
int k = 0;
rs.beforeFirst();
while (rs.next()) {
try {
a[k][0] = rs.getInt(1);
a[k][1] = rs.getString(2);
a[k][2] = rs.getString(3);
a[k][3] = rs.getString(4);
a[k][4] = rs.getInt(5);
k++;
}
catch (SQLException e2) {e2.printStackTrace();}
}
con.close();
} catch (SQLException ee) {
System.out.println(ee);
}
table = new JTable(a,name);
getContentPane().removeAll();
add(jPanel1,BorderLayout.SOUTH);
add(new JScrollPane(table),BorderLayout.CENTER);
}
}
}
楼主在语句
int lastnum = rs.getRow();
之前加一句:
rs.last();
看看。(我怀疑不加这句,lastnum=1,行数多的话,数组就越界了。),并在之后打印出lastnum看看。
很明显,数组下标越界了
数据库查询后的语句改一下:
getContentPane().removeAll();
table = new JTable(a,name);
table.repaint();
getContentPane().add(jPanel1,BorderLayout.SOUTH);
getContentPane().add(new JScrollPane(table),BorderLayout.CENTER);
setVisible(true); //加这句.
要把jtable中大的二维数组a【】【】重新分配空间,改变行数,然后再重新分配jtable空间