- 浏览: 319296 次
- 性别:
- 来自: 广州
-
文章分类
最新评论
-
opalescent_:
学习了。。
java笔试题的整理和解答扩展(String专题) -
yixiao258964:
谢谢,找了好久Reverse Enginee,都说在datab ...
PowerDesigner Reverse Engineer from database-mysql -
javaAlpha:
介绍的真全啊
Java编程那些事儿86——文件操作之File类使用
Java编程那些事儿83——异常处理语法2
陈跃峰
出自:http://blog.csdn.net/mailbomb
10.3.3 捕获异常及异常处理
在整个异常处理机制中,异常在系统中进行传递,传递到程序员认为合适的位置,就捕获到该异常,然后进行逻辑处理,使得项目不会因为出现异常而崩溃。
为了捕获异常并对异常进行处理,使用的捕获异常以及处理的语法格式为:
try{
//逻辑代码
}catch(异常类名 参数名){
//处理代码
}
在该语法中,将正常的程序逻辑代码书写在try语句块内部进行执行,这些代码为可能抛出异常的代码,而catch语句中书写对应的异常类的类名,在catch语句块内部书写出现该类型的异常时的处理代码。
程序执行到try-catch语句时,如果没有发生异常,则完整执行try语句块内部的所有代码,而catch语句块内部的代码不会执行,如果在执行时发生异常,则从发生异常的代码开始,后续的try语句块代码不会执行,而跳转到该类型的异常对应的catch语句块中。
示例代码如下:
String s = "123";
try{
int n = Integer.parseInt(s);
System.out.println(n);
}catch(NumberFormatException e){
System.out.println("该字符串无法转换!");
}
在该示例代码中,Integer类的parseInt方法可能会抛出NumberFormatException,因为parseInt方法的声明如下:
public static int parseInt(String s) throws NumberFormatException
这里字符串s转换为int没有发生异常,则程序执行完try语句块内部的代码,程序的运行结果为:
123
如果将字符串对象s的值修改为”abc”,则运行上面的代码,则parseInt方法执行时将抛出NumberFormatException,则调用parseInt方法语句后续的try语句块中的代码不会执行,程序的执行流程跳转到捕获NumberFormatException异常的catch语句块内部,然后执行该catch语句块内部的代码,则程序的执行结果是:
该字符串无法转换!
这就是最基本的捕获异常和异常处理的代码结构。使用try语句捕获程序执行时抛出的异常,使用catch语句块匹配抛出的异常类型,在catch语句块内部书写异常处理的代码。
在实际程序中,也可以根据异常类型的不同进行不同的处理,这样就需要多个catch语句块,其结构如下:
try{
//逻辑代码
} catch(异常类名1 参数名1){
//处理代码1
} catch(异常类名2 参数名2){
//处理代码2
}
……
}catch(异常类名n 参数名n){
//处理代码n
}
例如:
String s = "123";
try{
int n = Integer.parseInt(s);
System.out.println(n);
char c = s.charAt(4);
System.out.println(c);
}catch(NumberFormatException e){
System.out.println("该字符串无法转换!");
}catch(StringIndexOutOfBoundsException e){
System.out.println("字符串索引值越界");
}
在执行时,按照catch语句块书写的顺序从上向下进行匹配,直到匹配到合适的异常就结束try-catch语句块的执行。
在实际执行时,就可以根据捕获的异常类型不同,书写不同的异常处理的代码了。使用该语法时需要注意,如果这些异常类直接存在继承关系,则子类应该书写在上面,父类应该书写在下面,否则将出现语法错误。例如:
String s = "123";
try{
int n = Integer.parseInt(s);
System.out.println(n);
char c = s.charAt(4);
System.out.println(c);
}catch(Exception e){
}catch(NumberFormatException e){ //语法错误,异常已经被处理
System.out.println("该字符串无法转换!");
}catch(StringIndexOutOfBoundsException e){ //语法错误,异常已经被处理
System.out.println("字符串索引值越界");
}
这里Exception类是所有异常类的父类,在匹配时可以匹配到所有的异常,所有后续的两个异常处理的代码根本不会得到执行,所以将出现语法错误。正确的代码应该为:
String s = "123";
try{
int n = Integer.parseInt(s);
System.out.println(n);
char c = s.charAt(4);
System.out.println(c);
}catch(NumberFormatException e){
System.out.println("该字符串无法转换!");
}catch(StringIndexOutOfBoundsException e){
System.out.println("字符串索引值越界");
}catch(Exception e){
}
如果在程序执行时,所有的异常处理的代码都是一样的,则可以使用Exception代表所有的异常,而不需要一一进行区分,示例代码如下:
String s = "123";
try{
int n = Integer.parseInt(s);
System.out.println(n);
char c = s.charAt(4);
System.out.println(c);
}catch(Exception e){
//统一的处理代码
}
在实际使用时,由于try-catch的执行流程,使得无论是try语句块还是catch语句块都不一定会被完全执行,而有些处理代码则必须得到执行,例如文件的关闭和网络连接的关闭等,这样如何在try语句块和catch语句块中都书写则显得重复,而且容易出现问题,这样在异常处理的语法中专门设计了finally语句块来进行代码的书写。语法保证finally语句块内部的代码肯定获得执行,即使在try或catch语句块中包含return语句也会获得执行,语法格式如下:
finally{
//清理代码
}
该语法可以和上面的两种try-catch语句块匹配,也可以和try语句匹配使用,和try语句块匹配的语法格式如下:
try{
//逻辑代码
}finally{
//清理代码
}
这样在执行时,无论try语句块中的语句是否发生异常,finally语句块内部的代码都会获得执行。
而只书写finally而不书写catch则会导致异常的丢失,所以最常用的异常处理的语法格式还是如下语法:
try{
//逻辑代码
}catch(异常类名 参数){
//异常处理代码
}finally{
//清理代码
}
这样就是整个异常处理部分的逻辑代码、异常处理代码和清理的代码成为一个整体,使得程序代码更加显得紧凑,便于代码的阅读和使用。
最后,介绍一下使用异常处理语法时需要注意的问题:
1、书写在try语句块内部的代码执行效率比较低。所以在书写代码时,只把可能出现异常的代码书写在try语句块内部。
2、如果逻辑代码中抛出的异常属于RuntimeException的子类,则不强制书写在try语句块的内部,如果抛出的异常属于非RuntimeException的子类,则必须进行处理,其中书写在try语句块是一种常见的处理方式。
3、catch语句块中只能捕获try语句块中可能抛出的异常,否则将出现语法错误。
10.3.4 声明自定义异常类
如果JDK API中提供的已有的异常类无法满足实际的使用需要,则可以根据需要声明自定义的异常类来代表项目中指定类型的异常。
异常类在语法上要求必须直接或间接继承Exception,可以根据需要选择继承Exception或RuntimeException类,这样也设定了自定义异常类的类型。如果直接继承Exception,则属于必须被处理的异常,如果继承RuntimeException,则不强制必须被处理。当然,可以根据需要继承其它Exception的子类。
在编码规范上,一般将异常类的类名命名为XXXException,其中XXX用来代表该异常的作用。
示例代码如下:
/**
* 自定义异常类
*/
public class MyException extends RuntimeException {}
自定义异常类的用途,则完全由程序员进行规定,可以在出现该异常类型的条件时抛出该异常,则就可以代表该类型的异常了。
在实际的项目中,有些时候还需要设计专门的异常类体系,来代表各种项目中需要代表的异常情况。
10.4 异常处理方式
前面介绍了异常处理机制的相关语法,但是当出现异常时,如何进行处理是语法无法解决的问题,下面就介绍一下异常处理的方式。
异常处理,顾名思义就是将出现的异常处理掉,但是根据异常出现的位置以及异常的类型不同,会出现很多的方式,依次介绍如下:
1、不处理
该处理方式就是只捕获异常不进行处理。不推荐使用该方式。
例如:
String s = “abc”;
try{
int n = Integer.parseInt(s);
}catch(Exception e){
}
对于这样的处理,该异常被忽略掉了,有可能会影响后续逻辑的执行执行。该种处理方式一般被初学者使用的比较多。
2、直接处理掉
如果具备处理异常的条件,则可以根据不同的异常情况将该异常处理掉,例如给出用户错误原因的提示等或根据逻辑上的需要修正对应的数值。
例如:
/**
* 异常处理示例
* 该程序的功能是将用户输出的命令行参数转换为数字并输出
*/
public class ExceptionHandle1 {
public static void main(String[] args) {
int n = 0;
try{
//将输入的第一个命令行参数转换为数字
n = Integer.parseInt(args[0]);
//输出转换后的结果
System.out.println(n);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("请输入命令行参数!");
}catch(NumberFormatException e){
System.out.println("命令行参数不是数字字符串!");
}
}
}
在执行该代码时,如果发生数组下标越界异常,则代表用户未输入命令行参数,则提示用户输入命令行参数,如果发生数字格式化异常,则代表用户输入的第一个命令行参数不是数字字符串,则给出用户对应的提示信息。
该示例中就是根据异常出现的原因提示用户进行正确的操作,这是一种常见的异常处理的方式。
3、重新抛出
在实际的项目,有些时候也需要将某个方法内部出现的所有异常都转换成项目中自定义的某个异常类,然后再重新抛出。
例如:
try{
//逻辑代码
}catch(Exception e){
throw new MyException();
}
这样转换以后,比较容易发现异常出现的位置,也方便项目中逻辑上的处理。
4、在方法中声明
如果当前方法或构造方法中,或在当前方法或构造方法中调用的其它方法,会抛出某个异常,而在当前方法或构造方法中没有足够的信息对该异常进行处理,则可以将该异常进行传递,将该异常传递给调用当前方法的位置在进行处理。这就是异常在系统中传递的方式。
例如:
/**
* 异常处理示例2
* 演示在方法中重新声明异常
*/
public class ExceptionHandle2 {
public void test(String s) throws NumberFormatException{
int n = Integer.parseInt(s);
System.out.println(n);
}
}
在test方法中,由于parseInt方法会抛出NumberFormatException异常,而该方法内部无法对此进行处理,所以则在test方法内部声明把NumberFormatException异常抛出,这样该异常就由调用test的方法再进行处理。这样异常就可以在方法之间进行传递了。
这里列举了异常处理中常见的一些处理方式,当然也可以根据需要,进行其它的处理。
10.5 总结
异常处理是Java语言中增强程序健壮性的一种机制,Java语法为异常处理提供了一系列的语法格式,在实际的项目中,需要根据具体的情况对异常给出对应的处理,使得异常能够被正确的处理掉,从而保证项目的正常执行。
发表评论
-
Java编程那些事儿37—for语句语法
2008-06-17 11:53 752Java编程那些事儿37—for语句语法 郑州游戏学院 陈跃 ... -
Java编程那些事儿38—break和continue语句
2008-06-18 15:01 789Java编程那些事儿38—break和continue语句 ... -
Java编程那些事儿39—流程控制综合示例1
2008-06-19 12:30 803Java编程那些事儿39—流程控制综合示例1 郑州游戏学院陈 ... -
Java编程那些事儿40—流程控制综合示例2
2008-06-19 20:23 902Java编程那些事儿40—流程控制综合示例2 郑州游戏学院陈 ... -
Java编程那些事儿41—流程控制综合示例3
2008-06-20 18:06 709<meta http-equiv="Conte ... -
Java编程那些事儿42—流程控制综合练习
2008-06-20 22:13 817Java编程那些事儿42—流程控制综合练习 郑州游戏学院 陈 ... -
Java编程那些事儿57—面向对象基础
2008-07-28 14:15 784Java编程那些事儿57—面向对象基础 郑州游戏学院 陈跃峰 ... -
Java编程那些事儿58—类(一)
2008-07-29 11:05 726Java编程那些事儿58—类(一) 郑州游戏学院 陈跃峰 ... -
Java编程那些事儿59——类(二)
2008-08-04 23:36 711Java编程那些事儿59——类(二) 郑州游戏学院 陈跃峰 ... -
Java编程那些事儿60——对象
2008-08-18 23:49 643Java编程那些事儿60—— ... -
Java编程那些事儿61—面向对象设计方法和面向对象特性(一)
2008-08-29 21:42 767Java编程那些事儿61—面向对象设计方法 郑州游戏学院 陈 ... -
Java编程那些事儿62——继承(二)
2008-09-08 12:11 831Java编程那些事儿62——继承(二) 郑州游戏学院 ... -
Java编程那些事儿63—多态性
2008-09-27 10:31 760Java编程那些事儿63—多态性 郑州游戏学院 陈跃峰 出 ... -
Java编程那些事儿64——访问控制符、修饰符和其它关键字
2008-10-14 14:12 809<meta http-equiv="Conte ... -
Java编程那些事儿65——static修饰符
2008-10-23 15:46 836Java编程那些事儿65——static修饰符 郑州游戏学院 ... -
Java编程那些事儿66——final修饰符
2008-11-11 17:19 743Java编程那些事儿66——f ... -
Java编程那些事儿67——this和super
2008-11-12 12:25 977Java编程那些事儿67——this和super 陈跃峰 ... -
Java编程那些事儿68——抽象类和接口(一)
2008-12-22 11:31 764Java编程那些事儿68—— ... -
Java编程那些事儿69——抽象类和接口(二)
2008-12-27 16:25 990Java编程那些事儿69——抽象类和接口(二) 陈跃峰 ... -
Java编程那些事儿70——抽象类和接口(三)
2009-01-05 14:20 1199Java编程那些事儿70—— ...
相关推荐
1. **操作灵活性**:Java的语法简洁且易于理解,它允许程序员以更少的代码实现复杂的逻辑,降低了编程的复杂性,提高了开发效率。 2. **可移植性**:Java遵循“一次编写,到处运行”的原则,由于其跨平台的特性,...
《Java编程那些事儿》是陈跃峰先生撰写的一部关于Java编程的完整教程,共包含了110个章节,深入浅出地讲述了Java语言的核心概念和技术。这部教程以chm(Compiled HTML Help)格式呈现,是一种常见的电子书格式,便于...
《Java编程那些事儿》是陈跃峰先生的一本关于Java编程技术的著作,该书深入浅出地介绍了Java编程中的重要概念和实践技巧。这里我们主要聚焦于压缩包中的部分内容,涉及Java集合框架、时间日期处理、文件操作、多线程...
在本项目中,"学习JAVA编程,完成作业——编一个控制台梭哈游戏.zip",开发者采用Java语言创建了一个基于控制台的梭哈(Poker)游戏。这是一款非常适合初学者进行实践和学习的项目,它涵盖了Java编程基础、面向对象...
这份"java语法大全"文档,结合了“java语法”,“java编程基础”,以及“java入门”等核心主题,旨在为初学者提供全面的学习资源,帮助他们理解和掌握Java语言的基本概念和高级特性。 首先,Java语法是学习Java的...
Java语言包含标识符、关键字、运算符和分隔符等元素。这些元素有着不同的语法含义和组成规则,它们互相配合,共同组成Java的语句。
3. **异常处理**:JAVA提供了一种结构化的异常处理机制,学习笔记会解释何时及如何使用try-catch-finally语句块,以及不同类型的异常类。 4. **内存管理与垃圾回收**:JAVA的自动内存管理是通过垃圾回收机制实现的...
接着深入探讨了Java的进阶特性,如面向对象编程(类、对象、封装、继承、多态)、异常处理机制、集合框架(Collection和Map接口及其常用实现类)。通过两个实用案例——学生成绩管理系统和文件处理应用,展示了Java...
最后讨论了异常处理的重要方法——try-catch 结构和 finally 块的应用以及 Java 7 引入的改进型 try-with-resources 语法,特别强调了这些结构在提高程序稳定性方面的优势。 适用人群:具备一定的 Java 编程基础,...
1. **基础语法**:Java的基础语法是学习任何编程语言的起点。这包括变量声明、数据类型(如整型、浮点型、字符型和布尔型)、运算符(算术、比较、逻辑等)、流程控制(如if语句、switch语句、for循环、while循环)...
异常处理:阐述Java的异常处理机制,包括try-catch-finally语句、自定义异常等。 集合框架:详细介绍Java的集合框架,包括List、Set、Map等接口及其实现类。 I/O流:讲解Java的输入输出流,包括文件操作...
第2章 Java基本语法 第3章 类和接口 第4章 Java Applet 第5章 Java图形处理 第6章 Java用户界面技术 第7章 异常、事件和多线程机制 第8章 输入输出技术 第9章 Java数据库技术 第10章 Java安全技术 第11章 ...
这份“Java JDK 6学习笔记——ppt简体版”涵盖了Java语言的核心概念、语法特性以及JDK 6的新功能,旨在帮助初学者和有经验的开发者深入理解并掌握这一版本的Java开发环境。 首先,Java JDK 6的安装与配置是学习的...
Java基础语法 面向对象编程 Java集合框架 异常处理与调试 Java多线程编程 Java网络编程 Java数据库连接(JDBC) Java标准类库 Java虚拟机(JVM)原理 Java泛型与反射 Java注解与元数据 Java高级特性:Lambda表达式 ...
Java JDK 6学习笔记——PPT简体版是针对初学者和有经验的开发者们的一份宝贵资源,它深入浅出地介绍了Java编程语言的核心概念和技术。这份笔记以PPT的形式呈现,使得学习过程更加直观易懂,适合课堂教学或自我学习。...
### Java自学之路——超详细含练习项目及源码 #### Java知识体系最强总结 本篇文章旨在根据提供的文件信息,深入解读Java自学之路的关键知识点,并针对其中提到的学习资源进行详细的解析,帮助初学者更好地掌握...
1. Java基础:包括语法、面向对象编程、异常处理等。 2. GUI编程:使用Swing或JavaFX创建用户界面。 3. 数据库管理:理解SQL语言,能进行基本的数据库设计和操作。 4. 网络编程:了解Socket或RMI原理,实现客户端和...
【标题】"HNU编程新技术实务实验一——Java语言编程"揭示了这是一份与Java编程相关的学习资源,特别关注于湖南大学(HNU)的编程新技术实务课程中的实验项目。这个实验可能涵盖基础到进阶的Java编程概念,旨在帮助...