Java try catch语句详解
Java 的异常处理通过 5 个关键字来实现:try、catch、throw、throws 和 finally。try catch 语句用于捕获并处理异常,finally 语句用于在任何情况下(除特殊情况外)都必须执行的代码,throw 语句用于拋出异常,throws 语句用于声明可能会出现的异常。
本节先主要介绍 Java 中的 try catch 语句。在 Java 中通常采用 try catch 语句来捕获异常并处理。语法格式如下:
在以上语法中,把可能引发异常的语句封装在 try 语句块中,用以捕获可能发生的异常。catch 后的try {
// 可能发生异常的语句
} catch(ExceptionType e) {
// 处理异常语句
}
( )里放匹配的异常类,指明 catch 语句可以处理的异常类型,发生异常时产生异常类的实例化对象。如果 try 语句块中发生异常,那么一个相应的异常对象就会被拋出,然后 catch 语句就会依据所拋出异常对象的类型进行捕获,并处理。处理之后,程序会跳过 try 语句块中剩余的语句,转到 catch 语句块后面的条语句开始执行。
如果 try 语句块中没有异常发生,那么 try 块正常结束,后面的 catch 语句块被跳过,程序将从 catch 语句块后的条语句开始执行。
注意:try...catch 与 if...else 不一样,try 后面的花括号{ }不可以省略,即使 try 块里只有一行代码,也不可省略这个花括号。与之类似的是,catch 块后的花括号{ }也不可以省略。另外,try 块里声明的变量只是代码块内的局部变量,它只在 try 块内有效,其它地方不能访问该变量。
在上面语法的处理代码块 1 中,可以使用以下 3 个方法输出相应的异常信息。
printStackTrace() 方法:指出异常的类型、性质、栈层次及出现在程序中的位置(关于 printStackTrace 方法的使用可参考《Java的异常跟踪栈》一节)。
getMessage() 方法:输出错误的性质。
toString() 方法:给出异常的类型与性质。
例 1
编写一个录入学生姓名、年龄和性别的程序,要求能捕捉年龄不为数字时的异常。在这里使用 try catch 语句来实现,具体代码如下:
上述代码在 main() 方法中使用 try catch 语句来捕获异常,将可能发生异常的import java.util.Scanner;
public class Test02 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("---------学生信息录入---------------");
String name = ""; // 获取学生姓名
int age = 0; // 获取学生年龄
String sex = ""; // 获取学生性别
try {
System.out.println("请输入学生姓名:");
name = scanner.next();
System.out.println("请输入学生年龄:");
age = scanner.nextInt();
System.out.println("请输入学生性别:");
sex = scanner.next();
} catch (Exception e) {
e.printStackTrace();
System.out.println("输入有误!");
}
System.out.println("姓名:" + name);
System.out.println("年龄:" + age);
}
}
age = scanner.nextlnt();代码放在了 try 块中,在 catch 语句中指定捕获的异常类型为 Exception,并调用异常对象的 printStackTrace() 方法输出异常信息。运行结果如下所示。---------学生信息录入---------------
请输入学生姓名:
徐白
请输入学生年龄:
110a
java.util.InputMiatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
输入有误!
姓名:徐白
年龄:0
at text.text.main(text.java:19)
多重catch语句
如果 try 代码块中有很多语句会发生异常,而且发生的异常种类又很多。那么可以在 try 后面跟有多个 catch 代码块。多 catch 代码块语法如下:
在多个 catch 代码块的情况下,当一个 catch 代码块捕获到一个异常时,其它的 catch 代码块就不再进行匹配。try {
// 可能会发生异常的语句
} catch(ExceptionType e) {
// 处理异常语句
} catch(ExceptionType e) {
// 处理异常语句
} catch(ExceptionType e) {
// 处理异常语句
...
}
注意:当捕获的多个异常类之间存在父子关系时,捕获异常时一般先捕获子类,再捕获父类。所以子类异常必须在父类异常的前面,否则子类捕获不到。
例 2
上述代码通过 Java I/O(输入输出)流技术从文件 readme.txt 中读取字符串,然后解析成为日期。由于 Java I/O 技术还没有介绍,大家先不要关注 I/O 技术细节,只看调用它们时方发生的异常就可以了。public class Test03 {
public static void main(String[] args) {
Date date = readDate();
System.out.println("读取的日期 = " + date);
}
public static Date readDate() {
FileInputStream readfile = null;
InputStreamReader ir = null;
BufferedReader in = null;
try {
readfile = new FileInputStream("readme.txt");
ir = new InputStreamReader(readfile);
in = new BufferedReader(ir);
// 读取文件中的一行数据
String str = in.readLine();
if (str == null) {
return null;
}
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date date = df.parse(str);
return date;
} catch (FileNotFoundException e) {
System.out.println("处理FileNotFoundException...");
e.printStackTrace();
} catch (IOException e) {
System.out.println("处理IOException...");
e.printStackTrace();
} catch (ParseException e) {
System.out.println("处理ParseException...");
e.printStackTrace();
}
return null;
}
}
在 try 代码块中第 12 行代码调用 FileInputStream 构造方法可能会发生 FileNotFoundException 异常。第 16 行代码调用 BufferedReader 输入流的 readLine() 方法可能会发生 IOException 异常。FileNotFoundException 异常是 IOException 异常的子类,应该先捕获 FileNotFoundException 异常,见代码第 23 行;后捕获 IOException 异常,见代码第 26 行。
如果将 FileNotFoundException 和 IOException 捕获顺序调换,那么捕获 FileNotFoundException 异常代码块将永远不会进入,FileNotFoundException 异常处理永远不会执行。 上述代码第 29 行 ParseException 异常与 IOException 和 FileNotFoundException 异常没有父子关系,所以捕获 ParseException 异常位置可以随意放置。
- 随机文章
- 青海马尔代夫玩乐(青海省的度假胜地:马尔代夫玩乐)
- 马尔代夫选美小姐(马尔代夫美女角逐登场,选出小姐佳丽!)
- 南京 飞 马尔代夫(南京飞往马尔代夫,迎接热情海岛行摄!)
- 秋日 马尔代夫(秋季马尔代夫之旅)
- 曼谷马尔代夫连线(曼谷与马尔代夫直通航线开通)
- 游客 马尔代夫(游客享受马尔代夫美好假期)
- 印度马尔代夫介绍(探索印度洋上的天堂——马尔代夫岛国)
- 安娜塔拉马尔代夫(安娜塔拉马尔代夫:从海滩到鲸鲨之旅)
- 央视解说马尔代夫(央视解说:马尔代夫,印度洋上的明珠)
- 缙云 马尔代夫(缙云旅行达人带你畅游马尔代夫)
- 泰国马尔代夫日本(泰国、马尔代夫与日本:三地旅游攻略)
- 潮汕马尔代夫简介(探索潮汕特色美食与马尔代夫浪漫风情)
- 重庆 马尔代夫 航班(重庆至马尔代夫直达航班开通,限时特价抢购!)
- 蜜月马尔代夫图片(浪漫蜜月之旅:马尔代夫美景尽收眼底)
- 哪里 马尔代夫(重返热带天堂:马尔代夫旅游重开!)
- 临沂 马尔代夫(临沂市民上岛游!畅享马尔代夫美景。)
- 迪拜马尔代夫位置(迪拜马尔代夫:世界上最美的旅游胜地)
- 日本马尔代夫现状(日本游客无缘马尔代夫,旅游业受冲击)
- 马尔代夫假水测评(马尔代夫:揭秘度假村的真实海水质量)
- 郑和马尔代夫视频(郑和船队神秘亮相、马尔代夫视频曝光)
- 马尔代夫到达中国(马尔代夫航班恢复,首批游客抵达中国)
- 平南 马尔代夫(平南旅游项目承建企业获得马尔代夫岛屿开发合同)
- 马尔代夫儿子照片(马尔代夫父亲拍下的儿子照片辉煌夺金)
- 马尔代夫包机回汉(直接回汉!马尔代夫包机安全抵达中国)
- 马尔代夫吃饭签单(马尔代夫餐厅账单新规,游客须签确认)
- 麻袋 马尔代夫(「麻袋」畅游马尔代夫,体验独特的海上生活!)
- 马尔代夫和棕榈岛(探索度假最佳选择:马尔代夫和棕榈岛)
- 马尔代夫厦门对比(厦门与马尔代夫:度假胜地的豪华比拼)
- 马尔代夫坐船出行(坐船畅游马尔代夫:探索美丽海洋世界)
- 马尔代夫司机小费(马尔代夫交通:当地司机小费风俗解析)
