不知道怎么去处理循环

来源:1-9 经验总结

天影

2015-08-02 16:54

package library;
import java.util.InputMismatchException;
import java.util.Scanner;
public class tushu {
 public static String[] books = { "高数", "代数", "英语", "语文" };
 public static String byBookName(String filterName) {
  for (String book : books) {
   if (book.contains(filterName)) {
    return book;
   }
  }
  return "不存在";
 }
 public static String byBookID(int bookID) {
  return books[bookID - 1];
 }
 public static void main(String[] args) {
  System.out.println("输入命令: 1-按照名称查找图书; 2-按照序号查找图书");
  Scanner scanner = new Scanner(System.in);
  // 当输入的值为非1和非2的时候, 提示重新输入!
  int filterType = 0;
  int i = 0;
  do {
   if (i != 0) {
    System.out.println("命令输入错误! 请根据提示输入数字命令!");
   }
   i++;
   try {
    filterType = scanner.nextInt();
   } catch (InputMismatchException e) {
    scanner = new Scanner(System.in);
   }
  } while (filterType != 1 && filterType != 2);
  
  //进入查找图书的流程
  if (filterType == 1) {
   System.out.println("输入图书名称:");
   String bookName = byBookName(scanner.next());
   if (bookName.equals("不存在")) {
    System.out.println("图书不存在!");
   } else {
    System.out.println("book:" + bookName);
   }
  } else {
   System.out.println("输入图书序号:");
   try {
    String bookName = byBookID(scanner.nextInt());
    System.out.println("book:" + bookName);
   } catch (InputMismatchException e) {
    System.out.println("输入类型错误, 抛出错误命令异常, 提示重新输入");
   } catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("图书不存在!");
   }
   scanner.close();
  }
 }
}

‍

老师的代码

while (true) {
   System.out.println("输入图书序号:");
   try {
    //获取输入的图书序号(数组下标)
    int index = inputCommand();
    //若返回值为-1
    if(index == -1){
     System.out.println("命令输入错误!请根据提示输入数字命令!");
     continue;
    }
    //若不出现”数组下标越界异常“,则返回相应位置的图书
    String book = books[index];
    return book;
   } catch (ArrayIndexOutOfBoundsException e) {
    //输入的序号不存在(引发”数组下标越界异常“),则抛出”图书不存在异常“
    Exception bookNotExists = new Exception("图书不存在!");
    bookNotExists.initCause(e);
    throw bookNotExists;
   }
  }

写回答 关注

2回答

  • 神经旷野舞者
    2015-08-04 13:48:02

    你可以在异常处理里重新定义输入类对象,就可以避免死循环了

  • 菜篮菜篮
    2015-08-03 22:50:44

    进入死循环的原因是因为你的数据缓存区中依旧保存着你输入的字母,而此时调用nextInt方法会自动解析数据缓存区所保留的字母,类似c里面用fflush(stdin)可清除~不知道java中有没有类似功能的这个

    天影

    这段代码不会进入死循环的,只是我不知道怎么把这个循环判断写的简短。 在第三季的课程中,我已经得到答案了。 在下面这段代码中, 老师用到了, while(true),来循环执行, 用continue和(return/break)来决定是继续循环还是结束循环。而不需要像我代码中, 定义一个int i来判断,do里面的内容是否是第一次执行。

    2015-08-06 00:38:24

    共 1 条回复 >

Java入门第三季

Java中你必须懂得常用技能,不容错过的精彩,快来加入吧

409792 学习 · 4340 问题

查看课程

相似问题