当程序运行出现以外的情形时,系统将自动生成一个Exception对象来通知程序,从而实现“业务功能实现代码”和“错误处理代码”分类,提供更好的可读性。
为了将“错误处理代码”从“业务实现代码”中分离出来,考虑下面的伪代码:
1 if(一切正常) 2 { 3 //业务实现代码 4 } 5 else 6 { 7 alert 输入不合法 8 goto retry 9 }
java提出了一种假设:如果程序可以顺利完成,那么”一切正常”,把系统的业务实现代码放在try块中定义,所有异常处理逻辑放在catch块中处理。下面是Java异常处理机制的语法结构:
1 try 2 { 3 //业务实现代码 4 } 5 catch(Exception e)//捕获(catch)异常 6 { 7 alert 输入不合法 8 goto retry 9 }
如果执行try块里的业务代码时出现异常,系统将会自动生成一个异常对象,该异常对象被提交给Java运行环境,这个过程被称为抛出(throw)异常。
当Java运行时环境收到异常对象时,会寻找能处理该异常对象的catch块,如果找到合适的catch块,则把该异常对象将给catch块处理,这个过程被称为捕获(catch)异常;如果Java运行时环境找不到捕获异常的catch块,则运行环境终止,Java程序也将退出。
1 import java.io.*; 2 public class Gobang 3 { 4 // 定义一个二维数组来充当棋盘 5 private String[][] board; 6 // 定义棋盘的大小 7 private static int BOARD_SIZE = 15; 8 public void initBoard() 9 { 10 // 初始化棋盘数组 11 board = new String[BOARD_SIZE][BOARD_SIZE]; 12 // 把每个元素赋为"╋",用于在控制台画出棋盘 13 for (var i = 0; i < BOARD_SIZE; i++) 14 { 15 for (var j = 0; j < BOARD_SIZE; j++) 16 { 17 board[i][j] = "╋"; 18 } 19 } 20 } 21 // 在控制台输出棋盘的方法 22 public void printBoard() 23 { 24 // 打印每个数组元素 25 for (var i = 0; i < BOARD_SIZE; i++) 26 { 27 for (var j = 0; j < BOARD_SIZE; j++) 28 { 29 // 打印数组元素后不换行 30 System.out.print(board[i][j]); 31 } 32 // 每打印完一行数组元素后输出一个换行符 33 System.out.print("\n"); 34 } 35 } 36 public static void main(String[] args) throws Exception 37 { 38 var gb = new Gobang(); 39 gb.initBoard(); 40 gb.printBoard(); 41 // 这是用于获取键盘输入的方法 42 var br = new BufferedReader( 43 new InputStreamReader(System.in)); 44 String inputStr = null; 45 // br.readLine():每当在键盘上输入一行内容按回车, 46 // 用户刚刚输入的内容将被br读取到。 47 while ((inputStr = br.readLine()) != null) 48 { 49 try 50 { 51 // 将用户输入的字符串以逗号作为分隔符,分解成2个字符串 52 String[] posStrArr = inputStr.split(","); 53 // 将2个字符串转换成用户下棋的坐标 54 var xPos = Integer.parseInt(posStrArr[0]); 55 var yPos = Integer.parseInt(posStrArr[1]); 56 // 把对应的数组元素赋为"●"。 57 if (!gb.board[xPos - 1][yPos - 1].equals("╋")) 58 { 59 System.out.println("您输入的坐标点已有棋子了," 60 + "请重新输入"); 61 continue; 62 } 63 gb.board[xPos - 1][yPos - 1] = "●"; 64 } 65 catch (Exception e) 66 { 67 System.out.println("您输入的坐标不合法,请重新输入," 68 + "下棋坐标应以x,y的格式"); 69 continue; 70 } 71 72 gb.printBoard(); 73 System.out.println("请输入您下棋的坐标,应以x,y的格式:"); 74 } 75 } 76 }