java - 线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException:12
问题描述
在我将记录附加到文本文件之前,一切正常,但是当我将记录附加到文本文件时,当我运行程序时它开始出现错误。我现在不知道哪里出错了
第一个错误
javaapplication1.LoginWindow.actionPerformed(LoginWindow.java:102)
属于这行代码Dashboard d = new Dashboard();
第二个错误
javaapplication1.Dashboard.<init>(Dashboard.java:200)
属于这行代码data[i][12] = "" + std.getAcdmcq1();
输出照片。这张图片显示了我附加到文本文件的记录输出
下面是显示的错误
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 12
at javaapplication1.Dashboard.<init>(Dashboard.java:200)
at javaapplication1.LoginWindow.actionPerformed(LoginWindow.java:102)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6533)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6298)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4889)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
at java.awt.Container.dispatchEventImpl(Container.java:2280)
at java.awt.Window.dispatchEventImpl(Window.java:2746)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
这是 LoginWindow.java:
package javaapplication1;
import java.awt.Color;
import javax.swing.*;
import java.awt.event.*;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class LoginWindow extends JFrame implements ActionListener,ItemListener,MouseListener{
private JLabel userName_label;
private JTextField userName;
private JLabel password_label;
private JPasswordField password;
private JButton loginButton;
private JPanel panel;
private JCheckBox display_pswrd;
private JLabel noAccount;
private JLabel role;
private JComboBox roleCmb;
public LoginWindow(){
final int win_width = 300; //window width in pixels
final int win_height = 250; //window height in pixels
setTitle("Login"); //set this window's title
setSize(win_width,win_height); //set the size of this window
//Create the components here
userName_label = new JLabel("Username: ");
userName_label.setBounds(10,20,80,25);
userName = new JTextField(15);
userName.setBounds(100,20,165,25);
password_label = new JLabel("Password: ");
password_label.setBounds(10,50,80,25);
password = new JPasswordField(15);
password.setBounds(100,50,165,25);
loginButton = new JButton("Login");
loginButton.setBounds(80,140,80,25);
loginButton.addActionListener(this);
role = new JLabel("Role: ");
role.setBounds(10,80,80,25);
String []roleList = {"","Admin","Lecturer"};
roleCmb = new JComboBox(roleList);
roleCmb.setBounds(100, 80, 165, 25);
display_pswrd = new JCheckBox("Show password");
display_pswrd.setBounds(100,110,165,25);
display_pswrd.addItemListener(this);
noAccount = new JLabel("Didn't have account ?");
noAccount.setBounds(70,170,165,25);
//set text color
noAccount.setForeground(Color.BLUE); //set text color
noAccount.addMouseListener(this);
panel = new JPanel();
//Set layout of the component which the component in the panel will align vertically
panel.setLayout(null);
panel.add(userName_label);
panel.add(userName);
panel.add(password_label);
panel.add(password);
panel.add(role);
panel.add(roleCmb);
panel.add(display_pswrd);
panel.add(loginButton);
panel.add(noAccount);
//set border for the panel
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Panel is added to the JFrane's content panel
getContentPane().add(panel);
//Set this frame visible and display
setVisible(true);
}
public void actionPerformed(ActionEvent e){
if(e.getSource() == loginButton){
//boolean usrFound = false;
String usr = userName.getText();
String pswrd = password.getText();
String loginRole = roleCmb.getSelectedItem().toString();
for(User user :AcademicSystem.allUser){ //for each user with details of username, password and role
if(user.getLogin_username().equals(usr)&&user.getLogin_password().equals(pswrd)&&user.getRole().equals(loginRole)){
AcademicSystem.user = user;
System.out.println(user.getLogin_username() + "\t" + userName.getText());
System.out.println(user.getLogin_password() + "\t" + password.getText());
System.out.println(user.getRole() + "\t" + roleCmb.getSelectedItem().toString());
System.out.println("");
}
}
if(AcademicSystem.user!=null){
if(roleCmb.getSelectedItem()=="Admin"){
JOptionPane.showMessageDialog(loginButton,"Username and password matched!");
JOptionPane.showMessageDialog(loginButton, "User[" + userName.getText() + "] have successfully logged in as " + roleCmb.getSelectedItem().toString() );
setVisible(false);
Dashboard d = new Dashboard();
d.setVisible(true);
//usrFound = true;
}else if(roleCmb.getSelectedItem()=="Lecturer"){
LecturerMenu lm = new LecturerMenu();
setVisible(false);
lm.setVisible(true);
}
}else{
JOptionPane.showMessageDialog(loginButton,"User not found");
AcademicSystem.user = null;
}
try{
PrintWriter p = new PrintWriter(new FileOutputStream("Logfile.txt", true)); //open the file in append mode
//p.print("USERNAME\tROLE\t\tACTION\t\tLOGON_TIME\n");
p.print(AcademicSystem.user.getLogin_username() + "\n");
p.print(AcademicSystem.user.getRole()+ "\n");
p.print("Login" + "\n");
Calendar cal = Calendar.getInstance();
SimpleDateFormat simpleformat = new SimpleDateFormat("dd/MMMM/yyyy hh:mm:s");
p.print(simpleformat.format(cal.getTime())+"\n");
p.println();
p.close();
}catch(Exception er){
JOptionPane.showMessageDialog(this,er);
}
}
}
//Detect the change of state of checkbox
public void itemStateChanged(ItemEvent ie){
if (ie.getSource() == display_pswrd){
if(display_pswrd.isSelected()){
// Setting a value of 0 indicates that you wish to see the text
//as it is typed, similar to the behavior of a standard JTextField
display_pswrd.setText("Hide Password");
password.setEchoChar((char)0);
}else{
display_pswrd.setText("Show Password");
password.setEchoChar('*');
}
}
}
public void mouseClicked(MouseEvent me){
int a = JOptionPane.showConfirmDialog(null, "Do your want to a register a new account?");
if (a == JOptionPane.YES_OPTION){
setVisible(false);
Register rg = new Register();
rg.setVisible(true);
}
else{
setVisible(true);
}
}
public void mouseReleased(MouseEvent e){
//...
}
public void mouseEntered(MouseEvent e){
//...
}
public void mouseExited(MouseEvent e){
//....
}
public void mousePressed(MouseEvent e){
///......
}
}
这是我的 Dashboard.java
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.PrintWriter;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class Dashboard extends JFrame implements ActionListener{
//declaration here
private JTabbedPane tp;
private JPanel studentPanel;
private JPanel enrolPanel;
private JLabel nameLabel;
private JTextField nameTextField;
private JLabel GenderLabel;
private JTextField GenderTxtField;
private JLabel raceLabel;
private JComboBox raceCmbBox;
private JComboBox genderCmbBox;
private JLabel icLabel;
private JTextField icTxtField;
private JLabel religionLabel;
private JTextField religionTxtField;
private JLabel NationalityLabel;
private JTextField nationalityTxtField;
private JLabel addressLabel;
private JTextField addressTxtField;
private JLabel emailLabel;
private JTextField emailTxtField;
private JLabel contactLabel;
private JTextField contactTxtField;
private JLabel maritalLabel;
private JComboBox maritalCmb;
private JLabel postcodeLabel;
private JTextField postcodeTxtField;
private JLabel countryLabel;
private JComboBox countryCmb;
private JLabel acdmcLabel;
private JTable tbl;
private JLabel no1Label;
private JTextField no1TxtField;
private JLabel no2Label;
private JTextField no2TxtField;
private JLabel no3Label;
private JTextField no3TxtField;
private JLabel dataTableLabel;
private JButton registerButton;
private JButton editButton;
private JButton deleteButton;
private JButton gnrReportButton;
private JButton logoutButton;
public Dashboard(){
setSize(2000,500);
setTitle("Dashboard");
//component here
tp =new JTabbedPane();
studentPanel = new JPanel();
studentPanel.setLayout(null); //default layout is flow layout, set it to null so then easily to set the location of each component
nameLabel = new JLabel("Name: ");
nameLabel.setBounds(10,20,80,25);
nameTextField = new JTextField(25);
nameTextField.setBounds(100,20,165,25);
icLabel = new JLabel("IC Number: ");
icLabel.setBounds(10,50,80,25);
icTxtField = new JTextField(25);
icTxtField.setBounds(100,50,165,25);
GenderLabel = new JLabel("Gender: ");
GenderLabel.setBounds(300,20,165,25);
String[] genderList = {"","Male","Female","Other"};
genderCmbBox = new JComboBox(genderList);
genderCmbBox.setBounds(390,20,165,25);
raceLabel = new JLabel("Race:");
raceLabel.setBounds(300,50,80,25);
String[] raceList = {"","Malay","Chinese","Indians"};
raceCmbBox = new JComboBox(raceList);
raceCmbBox.setBounds(390,50,165,25);
religionLabel = new JLabel("Religion: ");
religionLabel.setBounds(10,80,80,25);
religionTxtField = new JTextField(15);
religionTxtField.setBounds(100,80,165,25);
NationalityLabel = new JLabel("Nationality: ");
NationalityLabel.setBounds(300,80,80,25);
nationalityTxtField = new JTextField(15);
nationalityTxtField.setBounds(390,80,165,25);
contactLabel = new JLabel("Contact:");
contactLabel.setBounds(10,110,165,25);
contactTxtField = new JTextField(15);
contactTxtField.setBounds(100,110,165,25);
maritalLabel = new JLabel("Marital");
maritalLabel.setBounds(300,110,165,25);
String []maritalStatus_List = {"","Single","Married"};
maritalCmb = new JComboBox(maritalStatus_List);
maritalCmb.setBounds(390,110,165,25);
postcodeLabel = new JLabel("Postcode:");
postcodeLabel.setBounds(10,140,165,25);
postcodeTxtField = new JTextField(15);
postcodeTxtField.setBounds(100,140,165,25);
countryLabel = new JLabel("Country:");
countryLabel.setBounds(300,140,165,25);
String []countryList = {"","Sarawak","Sabah"};
countryCmb = new JComboBox(countryList);
countryCmb.setBounds(390,140,165,25);
addressLabel = new JLabel("Address: ");
addressLabel.setBounds(10,170,165,25);
addressTxtField = new JTextField(30);
addressTxtField.setBounds(100,170,455,25);
emailLabel = new JLabel("Email:");
emailLabel.setBounds(10,200,165,25);
emailTxtField = new JTextField(30);
emailTxtField.setBounds(100,200,455,25);
acdmcLabel = new JLabel("Academic Qualification");
acdmcLabel.setBounds(10,230,165,25);
no1Label = new JLabel("1.");
no1Label.setBounds(10,260,165,25);
no1TxtField = new JTextField(15);
no1TxtField.setBounds(40,260,520,25);
no2Label = new JLabel("2.");
no2Label.setBounds(10,290,165,25);
no2TxtField = new JTextField(15);
no2TxtField.setBounds(40,290,520,25);
no3Label = new JLabel("3");
no3Label.setBounds(10,320,165,25);
no3TxtField = new JTextField(15);
no3TxtField.setBounds(40,320,520,25);
dataTableLabel = new JLabel("Record Table: ");
dataTableLabel.setBounds(580,1,165,25);
registerButton = new JButton("Register");
registerButton.setBounds(600,360,165,25);
registerButton.addActionListener(this);
editButton = new JButton("Edit");
editButton.setBounds(800,360,165,25);
deleteButton = new JButton("Delete");
deleteButton.setBounds(1000,360,165,25);
gnrReportButton = new JButton("Generate Report");
gnrReportButton.setBounds(1200,360,165,25);
logoutButton = new JButton("Logout");
logoutButton.setBounds(1400,360,165,25);
logoutButton.addActionListener(this);
int size = AcademicSystem.allStdInfo.size();
String[][]data = new String[size][12];
for(int i =0; i<size; i++){
Student std = AcademicSystem.allStdInfo.get(i);
data[i][0] = std.getName();
data[i][1] = "" + std.getIc();
data[i][2] = "" + std.getRace();
data[i][3] = "" + std.getGender();
data[i][4] = "" + std.getReligion();
data[i][5] = "" + std.getNationality();
data[i][6] = "" + std.getContact();
data[i][7] = "" + std.getMarital();
data[i][8] = "" + std.getPostcode();
data[i][9] = "" + std.getCountry();
data[i][10] = "" + std.getAddress();
data[i][11] = "" + std.getEmail();
data[i][12] = "" + std.getAcdmcq1();
}
String[]columns = {"Name","Ic","Race","Gender","Religion","Nationality","Contact","Marital","Postcode","Country","Address","Email","Academic Qualification"};
DefaultTableModel model = new DefaultTableModel(data,columns);
tbl= new JTable(model);
JScrollPane sp = new JScrollPane(tbl);
sp.setBounds(580,20,1335,325);
studentPanel.add(nameLabel);
studentPanel.add(nameTextField);
studentPanel.add(icLabel);
studentPanel.add(icTxtField);
studentPanel.add(raceLabel);
studentPanel.add(raceCmbBox);
studentPanel.add(GenderLabel);
studentPanel.add(genderCmbBox);
studentPanel.add(religionLabel);
studentPanel.add(religionTxtField);
studentPanel.add(NationalityLabel);
studentPanel.add(nationalityTxtField);
studentPanel.add(contactLabel);
studentPanel.add(contactTxtField);
studentPanel.add(maritalLabel);
studentPanel.add(maritalCmb);
studentPanel.add(addressLabel);
studentPanel.add(addressTxtField);
studentPanel.add(postcodeLabel);
studentPanel.add(postcodeTxtField);
studentPanel.add(countryLabel);
studentPanel.add(countryCmb);
studentPanel.add(emailLabel);
studentPanel.add(emailTxtField);
studentPanel.add(acdmcLabel);
studentPanel.add(no1Label);
studentPanel.add(no1TxtField);
studentPanel.add(no2Label);
studentPanel.add(no2TxtField);
studentPanel.add(no3Label);
studentPanel.add(no3TxtField);
studentPanel.add(dataTableLabel);
studentPanel.add(sp);
studentPanel.add(registerButton);
studentPanel.add(editButton);
studentPanel.add(deleteButton);
studentPanel.add(gnrReportButton);
studentPanel.add(logoutButton);
enrolPanel = new JPanel();
tp.add("Student",studentPanel);
tp.add("Enrolment",enrolPanel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Panel is added to the JFrane's content panel
getContentPane().add(tp);
//Set this frame visible to be display
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e){
if(e.getSource()==logoutButton){
setVisible(false);
AcademicSystem.user = null;
LoginWindow lg = new LoginWindow();
lg.setVisible(true);
}
else if(e.getSource()==registerButton){
String name = nameTextField.getText();
String ic = icTxtField.getText();
String race = raceCmbBox.getSelectedItem().toString();
String gender = genderCmbBox.getSelectedItem().toString();
String religion = religionTxtField.getText();
String nationality = nationalityTxtField.getText();
String contact = contactTxtField.getText();
String marital = maritalCmb.getSelectedItem().toString();
String address = addressTxtField.getText();
String postcode = postcodeTxtField.getText();
String country = countryCmb.getSelectedItem().toString();
String email = emailTxtField.getText();
String acdmc = no1TxtField.getText()+" ," + no2TxtField.getText()+" ,"+no3TxtField.getText();
if(!name.equals("")&&!ic.equals("")&&!race.equals("")&&!gender.equals("")&&!religion.equals("")&&!nationality.equals("")&&!contact.equals("")&&!marital.equals("")&&!address.equals("")&&!postcode.equals("")&&!country.equals("")&&!email.equals("")&&!no1TxtField.equals("")&&!no2TxtField.equals("")&&!no3TxtField.equals("")){
JOptionPane.showMessageDialog(this,"Profile registered successfully");
boolean found = false;
for(int i=0; i<AcademicSystem.allStdInfo.size(); i++){
Student std = AcademicSystem.allStdInfo.get(i);
if(name.equals(std.getName())){
found = true;
break;
}
}
if(!found){
Student std = new Student(name,Integer.parseInt(ic),race,gender,religion,nationality,Integer.parseInt(contact),marital,Integer.parseInt(postcode),country,address,email,acdmc);
AcademicSystem.allStdInfo.add(std);
DefaultTableModel model1 = (DefaultTableModel)tbl.getModel();
model1.addRow(new Object[]{name,ic,race,gender,religion,nationality,contact,marital,postcode,country,address,email,acdmc});
}else{
JOptionPane.showMessageDialog(this,"This user is exists in the record");
}
}else if(e.getSource()==editButton){
try{
PrintWriter p = new PrintWriter("StudentInfo.txt");
for(int i=0; i<AcademicSystem.allStdInfo.size(); i++){
Student stdnt = AcademicSystem.allStdInfo.get(i);
p.println(stdnt.getName());
p.println(stdnt.getIc());
p.println(stdnt.getRace());
p.println(stdnt.getGender());
p.println(stdnt.getReligion());
p.println(stdnt.getNationality());
p.println(stdnt.getContact());
p.println(stdnt.getMarital());
p.println(stdnt.getPostcode());
p.println(stdnt.getCountry());
p.println(stdnt.getAddress());
p.println(stdnt.getEmail());
p.println(stdnt.getAcdmcq1());
p.println();
}
p.close();
}catch(Exception er){
}
}
}
}
}
解决方案
Java 数组是 0 索引的,这意味着它们从零开始,最大的索引是长度减 1。
如果您声明一个数组,并尝试访问超出长度的元素,则会得到您所得到的确切错误。
String[] data = new String[12];
data[12] = "this is an error";
使您的阵列更大。
String[] data = new String[13];
data[12] = "this is fine";
如果您习惯于 1 个基本索引,这可能会令人困惑。
更具体地说,在您的代码中声明一个数组。
String[][]data = new String[size][12];
然后您尝试在 for 循环中访问该数组。
data[i][12] = "" + std.getAcdmcq1();
请注意,由于 for 循环条件,如果 size 为 = 0,则此代码将不会运行。
推荐阅读
- python - Pandas(Python):如何使用条件填充具有前一行值的空单元格
- java - habarta typescript-generator : 将 Java 枚举转换为 Typescript 字符串数组
- windows - 将 PowerShell 脚本转换为安装包
- sql - 在 SQL Oracle 中用另一个案例做一个案例
- c - STM32创建RAM部分
- php - WooCommerce Dokan 多供应商隐藏具有特定订单状态的供应商的订单
- python - 从python中的字符串列表创建给定长度的随机列表
- python - 在 Python 中的进程产生的线程之间共享一个变量
- mongodb - Mongo DB - 使用属性中的值作为查询中第二个属性的键
- sql - 从 sql 查询条件转换为 REGEXP_LIKE