这咋先执行else了

img

img

books中多条数据情况下 如果满足数据的是第二条 第一次执行与传进来书名对比不相等,就会进入else 第二次才会进入if
你的代码没错 输出逻辑错了
把方法返回值换成true 或者false 我不知道你的返回值有没有用可以直接输出 ,判断地方换成

if (xx.equals(xx)){
  print('有书');
return true;
}

循环结束后:

print('没有书');
return false;

因为第一次来的时候,不相等,所以走了else。
所以打印语句应该在找的外面,
如果有,返回索引下标.那么说明有,
如果没有,那么返回-1就好了。
可以写成

    int index = -1;
    for(int i=0;i<books.length;i++)
    {
      if(books[i].getName().equals(bookname))
      {
          index = i;
          break;
      }
      else
      {
          continue;
      }
   }
      if(index!=-1)
          System.out.printlin("==========>书在"+index);

因为你这是一个for循环,第一次循环时不符合条件,就会显示无此书,符合条件则才会打印书名

出错的点在于:判断有没有书,需要遍历完整个books,同时if-else是互斥的,if不满足就进入else。所以当books中第一个元素不是《java》,就会走else。
修改:

public int queryBook(String bookname){
        int i;//将i提取出来,同时作为下面判断的依据。中间遍历books,最后再进行一次判断
        for(i=0;i<books.length;i++){
            if(books[i]!=null){
                if(books[i].getName().equals(bookname)){
                    System.out.println("有此书");
                    break;
                }
            }
        }
        if(i==books.length){//如果等于,说明上面的break没有执行,否则i必须小于length
            System.out.println("无此书");
        }
        return 1;
    }

应该把判断放在循环外,不要放在循环内,否则就会出现相反的情况

比如,你现在的情况就是,因为循环第一个是没有的,那他当然先走的就是else部分了

你把 java 这本书 放在你books 数组的第一个就不会执行 else了