Javatrycatch语句详解

格桑2021-09-17 10:46

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

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

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

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

    编写一个录入学生姓名、年龄和性别的程序,要求能捕捉年龄不为数字时的异常。在这里使用trycatch语句来实现,具体代码如下:

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()方法中使用trycatch语句来捕获异常,将可能发生异常的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代码块就不再进行匹配。

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

    例2 

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;
    }
}

    上述代码通过JavaI/O(输入输出)流技术从文件readme.txt中读取字符串,然后解析成为日期。由于JavaI/O技术还没有介绍,大家先不要关注I/O技术细节,只看调用它们时方法会发生的异常就可以了。

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

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

    以上就是小编为大家准备的“Javatrycatch语句详解”一文,更多相关内容尽在开课吧广场Java教程频道。

Javatrycatch语句详解

免责声明:本站所提供的内容均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用。如涉及版权问题,请联系本站管理员予以更改或删除。
有用
分享
全部评论快来秀出你的观点
登录 后可发表观点…
发表
暂无评论,快来抢沙发!
高并发编程训练营