在实际应用中,对于错误的处理是极其重要的,任何程序都很难做到百分百完美,程序中可能存在大量未知问题,所以程序开发时一定要对各种问题进行相应的处理,而 Java 提供的异常处理机制可以帮用户更好地解决这方面的问题。Java 的异常处理机制可以让程序具有极好的容错性,让程序更加健壮。

Java 的异常处理通过 5 个关键字来实现:try、catch、throw、throws 和 finally。try catch 语句用于捕获并处理异常,finally 语句用于在任何情况下(除特殊情况外)都必须执行的代码,throw 语句用于拋出异常,throws 语句用于声明可能会出现的异常。

本节先主要介绍 Java 中的 try catch 语句。在 Java 中通常采用 try catch 语句来捕获异常并处理。语法格式如下:

try {// 可能发生异常的语句
} catch(ExceptionType e) {// 处理异常语句
}

在以上语法中,把可能引发异常的语句封装在 try 语句块中,用以捕获可能发生的异常。catch 后的( )里放匹配的异常类,指明 catch 语句可以处理的异常类型,发生异常时产生异常类的实例化对象。

如果 try 语句块中发生异常,那么一个相应的异常对象就会被拋出,然后 catch 语句就会依据所拋出异常对象的类型进行捕获,并处理。处理之后,程序会跳过 try 语句块中剩余的语句,转到 catch 语句块后面的第一条语句开始执行。

如果 try 语句块中没有异常发生,那么 try 块正常结束,后面的 catch 语句块被跳过,程序将从 catch 语句块后的第一条语句开始执行。

注意:try…catch 与 if…else 不一样,try 后面的花括号{ }不可以省略,即使 try 块里只有一行代码,也不可省略这个花括号。与之类似的是,catch 块后的花括号{ }也不可以省略。另外,try 块里声明的变量只是代码块内的局部变量,它只在 try 块内有效,其它地方不能访问该变量。

在上面语法的处理代码块 1 中,可以使用以下 3 个方法输出相应的异常信息。

  • printStackTrace() 方法:指出异常的类型、性质、栈层次及出现在程序中的位置
  • getMessage() 方法:输出错误的性质。
  • toString() 方法:给出异常的类型与性质。

例 1
编写一个录入学生姓名、年龄和性别的程序,要求能捕捉年龄不为数字时的异常。在这里使用 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);}
}

上述代码在 main() 方法中使用 try catch 语句来捕获异常,将可能发生异常的age = scanner.nextlnt();代码放在了 try 块中,在 catch 语句中指定捕获的异常类型为 Exception,并调用异常对象的 printStackTrace() 方法输出异常信息。运行结果如下所示。

---------学生信息录入---------------
请输入学生姓名:
徐白
请输入学生年龄:
110a
java.util.InputMismatchExceptionat 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)
输入有误!
姓名:徐白
年龄:0at text.text.main(text.java:19)

多重catch语句

如果 try 代码块中有很多语句会发生异常,而且发生的异常种类又很多。那么可以在 try 后面跟有多个 catch 代码块。多 catch 代码块语法如下:

try {// 可能会发生异常的语句
} catch(ExceptionType e) {// 处理异常语句
} catch(ExceptionType e) {// 处理异常语句
} catch(ExceptionType e) {// 处理异常语句
...
}

在多个 catch 代码块的情况下,当一个 catch 代码块捕获到一个异常时,其它的 catch 代码块就不再进行匹配。

注意:当捕获的多个异常类之间存在父子关系时,捕获异常时一般先捕获子类,再捕获父类。所以子类异常必须在父类异常的前面,否则子类捕获不到。

例 2

public class Test {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;}
}

上述代码通过 Java I/O(输入输出)流技术从文件 readme.txt 中读取字符串,然后解析成为日期。

在 try 代码块中第 12 行代码调用 FileInputStream 构造方法可能会发生 FileNotFoundException 异常。第 16 行代码调用 BufferedReader 输入流的 readLine() 方法可能会发生 IOException 异常。FileNotFoundException 异常是 IOException 异常的子类,应该先捕获 FileNotFoundException 异常,见代码第 23 行;后捕获 IOException 异常,见代码第 26 行。

如果将 FileNotFoundException 和 IOException 捕获顺序调换,那么捕获 FileNotFoundException 异常代码块将永远不会进入,FileNotFoundException 异常处理永远不会执行。 上述代码第 29 行 ParseException 异常与 IOException 和 FileNotFoundException 异常没有父子关系,所以捕获 ParseException 异常位置可以随意放置。

1.5 try catch语句详解相关推荐

  1. Java try catch语句详解

    在实际应用中,对于错误的处理是极其重要的,任何程序都很难做到百分百完美,程序中可能存在大量未知问题,所以程序开发时一定要对各种问题进行相应的处理,而 Java 提供的异常处理机制可以帮用户更好地解决这 ...

  2. mysql explain语句_Mysql explain 语句详解

    explain 语句详解 explain 写在 select 前,如下 mysql> explain select * from user_info where id = 2\G ******* ...

  3. mysql切换用户sql语句,MySQL用户管理及SQL语句详解

    [(none)]>select user,host frommysql.user; #查询用户和主机+---------------+-----------+ | user | host | + ...

  4. Java教程:Java continue语句详解

    Java教程有时强迫一个循环提早反复是有用的,也就是,你可能想要继续运行循环,但是要忽略这次重复剩余的循环体的语句,所以 Java 提供了 continue 语句.continue 语句是 break ...

  5. smarty手册-smarty中foreach循环语句详解

    原文地址:smarty手册-smarty中foreach循环语句详解作者:谭博 {foreach}循环也有自身属性的变量,可以通过{$smarty.foreach.name.property}访问,其 ...

  6. 教妹学Java(十四):switch 语句详解

    大家好,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员.本篇文章通过我和三妹对话的形式来谈一谈"switch 语句". 教妹学 Java,没见过这么有趣的标题吧?&q ...

  7. MySQL数据库增删改查常用语句详解

    MySQL数据库增删改查常用语句详解 一 MySQL数据库表结构 1.1 常见数据类型 1.2 常用约束类型 1.3 MySQL存储引擎 二 DDL语句:数据定义语句 2.1 修改数据库密码 2.1. ...

  8. MyBatis SQL语句详解

    MyBatis SQL语句详解 1 CRUD标签 1.1 select 1.2 insert 1.3 update 1.4 delete 1.5 #{ }和${ }的区别 2 动态SQL 2.1 if ...

  9. mysql的load data_【MySQL】load data语句详解(一)

    作者  罗小波 沃趣科技高级MySQL数据库工程师 load data语句详解 背景 数据库版本:MySQL 5.7.18 服务器信息:本地到处导入在10.10.30.241上演示,local远程导入 ...

最新文章

  1. 确定修改——取消修改
  2. Delphi7 (第一天:类的编写)续
  3. tensorflow 使用CPU而不使用GPU的问题解决
  4. dnSpy反编译、部署调试神器
  5. Hadoop入门(三)HDFS API
  6. VS2010下开发WebApi 基本步骤
  7. 迅雷离线网页版API
  8. html表单查重,毕业论文的表格会被查重吗?
  9. macbookwps excel颜色填充快捷键_Excel VBA 实例(31) 为VBA代码自定义快捷键
  10. office图标异常处理
  11. 读书笔记:《重来REWORK》
  12. Java中事务的处理全解析
  13. 2023四川农业大学计算机考研信息汇总
  14. 内网穿透是什么?哪些作用?
  15. Android 内存检测工具
  16. JAVA的Stream
  17. 看PG10文档的笔记
  18. 字符串(1) : 首字母转大写/小写
  19. 基于安全可控软硬件产品云计算解决方案
  20. 我们已将Boost Note带到下一个高度。你体验了吗?

热门文章

  1. WRF,WPS,WRF-Chem安装及编译步骤及bug总结(1)
  2. Java正则表达式应用
  3. Redis 常用命令学习三:哈希类型命令
  4. 用jquery ajax做的select菜单,选中的效果
  5. maven工程src/main/java目录无法创建问题
  6. 51Nod --1133 不重叠的线段
  7. [数据结构-划分树小结]
  8. hdu 4614 Vases and Flowers
  9. (hibernate之三)session的delete方法
  10. Reflector 试用过期后重置试用