下面要给大家介绍的就是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当中,能够使用下面的三个方法输出相应的异常信息:
示例:
编写一个录入学生姓名、年龄和性别的程序,要求能捕捉年龄不为数字时的异常。
在这里使用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.InputMismatchException 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代码块语法:
try { // 可能会发生异常的语句 } catch (ExceptionType e) { // 处理异常语句 } catch (ExceptionType e) { // 处理异常语句 } catch (ExceptionType e) { // 处理异常语句 ... }
在多个catch代码块的情况下,当一个catch代码块捕获到一个异常的时候,其它的catch代码块就不再进行匹配。
注意:
当捕获的多个异常类之间存在父子关系的时候,捕获异常时一般先捕获子类,再捕获父类。
所以子类异常必须在父类异常的前面,否则子类捕获不到。
示例:
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; } }
上述代码通过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异常位置可以随意放置。
以上的内容你都了解了吗?更多相关常见问题,可以继续关注奇Q工具网来进行了解哦。
推荐阅读: