Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法在一个数组中存储多个记录_Java - Fatal编程技术网

Java 无法在一个数组中存储多个记录

Java 无法在一个数组中存储多个记录,java,Java,我正在尝试制作一个图书数据库GUI,在创建的数组中插入每本书的标题、作者和价格。 有一个搜索功能,可以根据书名搜索数据库中的特定书籍。 然而,我的代码似乎只适用于一本书,而不适用于多本书。 例如,我尝试在这里输入10本书的详细信息。 我只能搜索上一次创作的那本书 我的代码如下: class Book{ public String title,author; public int price; Book(String t,String a,int p){ t

我正在尝试制作一个图书数据库GUI,在创建的数组中插入每本书的标题、作者和价格。 有一个搜索功能,可以根据书名搜索数据库中的特定书籍。 然而,我的代码似乎只适用于一本书,而不适用于多本书。 例如,我尝试在这里输入10本书的详细信息。 我只能搜索上一次创作的那本书

我的代码如下:

class Book{
    public String title,author;
    public int price;
    Book(String t,String a,int p){
        this.title=t;
        this.author=a;
        this.price=p;
    }
}

class Swingdemo implements ActionListener{
    Book B[]=new Book[10];

    JLabel jl1;
    JTextField a1,a2,a3,a4;
    JButton j1,j2,j3;
    Swingdemo() {

        JFrame jfrm = new JFrame("Welcome");
        jfrm.setSize(180,300); 
        jfrm.setLayout(new FlowLayout());
        jfrm.setDefaultCloseOperation(jfrm.EXIT_ON_CLOSE);
        a1 = new JTextField(8);

        a2 = new JTextField(8);

        a3 = new JTextField(8);

        j1 = new JButton("Create");

        a4 = new JTextField(8);

        j2 = new JButton("Search");
        jl1 = new JLabel("Press a Button");
        j1.setActionCommand("1");
        j2.setActionCommand("2");
        j1.addActionListener(this);
        j2.addActionListener(this);
        jfrm.add(a1);
        jfrm.add(a2);
        jfrm.add(a3);
        jfrm.add(j1);
        jfrm.add(a4);
        jfrm.add(j2);
        jfrm.add(jl1); 
        jfrm.setVisible(true);
    }

    int num=0;
    public void actionPerformed(ActionEvent ae){
        if(ae.getActionCommand().equals("1")){
            B[num]=new Book(a1.getText(),a2.getText(),Integer.parseInt(a3.getText()));
            jl1.setText("Book has been added");
            num++;
        }

        else{
            int i;
            for(i=0;i<B.length;i++){
                if(B[i].title.equals(a4.getText()))
                    jl1.setText("Book has been found");
            }
            if(i==B.length)         
                jl1.setText("Book was not found");
        }
    }

    public static void main(String []args){
        SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                new Swingdemo();
            }
        });
    }
}
教材{
公共字符串标题、作者;
公共价格;
书本(字符串t、字符串a、整数p){
这个.title=t;
作者=a;
这个价格=p;
}
}
类Swingdemo实现ActionListener{
书B[]=新书[10];
JLabel-jl1;
JTextField a1、a2、a3、a4;
接线盒j1、j2、j3;
Swingdemo(){
JFrame jfrm=新JFrame(“欢迎”);
jfrm.setSize(180300);
jfrm.setLayout(新的FlowLayout());
jfrm.setDefaultCloseOperation(jfrm.EXIT_ON_CLOSE);
a1=新的JTextField(8);
a2=新的JTextField(8);
a3=新的JTextField(8);
j1=新按钮(“创建”);
a4=新的JTextField(8);
j2=新的JButton(“搜索”);
jl1=新的JLabel(“按下按钮”);
j1.setActionCommand(“1”);
j2.setActionCommand(“2”);
j1.addActionListener(本);
j2.addActionListener(本);
jfrm.添加(a1);
jfrm.add(a2);
jfrm.添加(a3);
jfrm.add(j1);
jfrm.添加(a4);
jfrm.add(j2);
jfrm.add(jl1);
jfrm.setVisible(真);
}
int num=0;
已执行的公共无效行动(行动事件ae){
如果(ae.getActionCommand()等于(“1”)){
B[num]=新书(a1.getText(),a2.getText(),Integer.parseInt(a3.getText());
jl1.setText(“已添加账簿”);
num++;
}
否则{
int i;
对于(i=0;i
boolean-found=false;

对于(i=0;i我更喜欢使用可选包装器,而不是像find这样的局部变量

Optional<Book> mbyBook = Optional.empty();
for (Book b : B) {
    if (b.title.equals(a4.getText())) {
       mbyBook = Optional.of(b);
       break;
    }
}
if (mbyBook.isPresent()) {
    jl1.setText(String.format("Book has been found %s", mbyBook));
} else {
    jl1.setText("Book was not found");
}
Optional mbyBook=Optional.empty();
(b:b册){
if(b.title.equals(a4.getText())){
mbyBook=可选的(b);
打破
}
}
if(mbyBook.isPresent()){
jl1.setText(String.format(“已找到%s本书”,mbyBook));
}否则{
jl1.setText(“未找到书”);
}

解决此类问题的方法是将其与所有不相关的Swing内容分离,形成自己的方法:

public String findBook(String title) {
    int i;
    for(i=0;i<B.length;i++){
       if(B[i].title.equals(title))
           return("Book has been found");
       }
       if(i==B.length)         
          return("Book was not found");
    }
}
现在,该方法独立于Swing,您可以自己测试它

第一个问题是它不会编译。现在我们已经用
return
返回了
setText
s,编译器可以注意到在代码中有一条路径没有返回任何东西,其中所有
if
都是false

因此,让我们通过在末尾添加一个返回来编译它。我们还将添加大括号
{}
,以便
if
在视觉上保持一致。永远不要遗漏大括号,即使编译器允许您这样做

public String findBook(String title) {
    for(int i=0;i<books.length;i++){
       if(books[i].title.equals(title))
          return("Book has been found");
       }
       if(i==books.length) {        
          return("Book was not found");
       }
    }
    return null;
}

当您找到一本书时,您不会退出循环并继续递增i。在末尾i始终等于B.length,并且您始终编写“book was not found”。请注意,
if(i==B.length)
条件总是匹配的,在代码的这个位置,
i
总是等于
B.length
。当发现
条件时,你需要在
if
条件中有一个
中断
。摆脱从块中省略
{}
的习惯。这会导致很难发现错误。演示如何使用
equals()
请正确,我要质疑,书名是一本书的唯一标识符……很抱歉,我没有正确检查原始代码,没有可供比较的书籍实例……非常感谢您提供如此详细和出色的答案,我非常感谢:)
public String findBook(String title) {
    int i;
    for(i=0;i<B.length;i++){
       if(B[i].title.equals(title))
           return("Book has been found");
       }
       if(i==B.length)         
          return("Book was not found");
    }
}
 jl1.setText(findBook(a4.getText());
public String findBook(String title) {
    for(int i=0;i<books.length;i++){
       if(books[i].title.equals(title))
          return("Book has been found");
       }
       if(i==books.length) {        
          return("Book was not found");
       }
    }
    return null;
}
public String findBook(String title) {
    for(int i=0;i<Books.length;i++){
       if(Books[i].title.equals(title))
          return("Book has been found");
       }
    }
    return("Book was not found");
}