- 浏览: 273476 次
- 性别:
- 来自: 东方水城
文章分类
最新评论
-
18335864773:
pageoffice 插件 可以实现 office文档的在线操 ...
Java调用com组件操作word -
coosummer:
推荐使用在线免费bug管理系统- bug 禅思:http:// ...
Bug管理工具 -
program_coco:
柠檬bug管理系统,一个在线的bug管理系统。www.lemo ...
Bug管理工具 -
影非弦:
这个in.read(data);//data是一个byte[] ...
Java串口通信总结 -
影非弦:
这个不详细啊,我弄了一天了,都没弄出来,总是出错,读信息的时候 ...
Java串口通信总结
首先看一下异常处理的完整语法,如下:
try{ //(尝试运行的)程序代码 }catch(异常类型 异常的变量名){ //异常处理代码 }finally{ //异常发生,方法返回之前,总是要执行的代码 }
在Java中,应用try-catch-finally结构可以使我们在出现异常的时候能保证相关资源被按时正确的清理。
我们都知道一个try-catch-finally结构,只要try块开始执行了,finally块里面的代码保证执行一次并且只执行一次。try-catch-finally给我们提供了在抛出异常时“保证执行某个动作”的机会,机会是提供了,但是finally一定会把握这次机会,完成某个动作的执行吗?或者说finally能完成它{...}里的相关操作吗?(当然这里除了system.exit()操作,因为在system.exit()时,finally是不会执行的)
下面我们就通过一个例子来说明一下,一个最常见的实例应用就是jdbc的Connection, Statement, ResultSet的使用。
先看一个例子:
例1:
void test(){ Connection conn = ...; Statement stmt = ...; ResultSet rset = ...; rset.close(); stmt.close(); conn.close(); ... }
乍一看,这个程序没有问题,按jdbc标准ResultSet, Statement, Connection都close()掉了,不用GC来帮忙回收资源了。但是如果在rset或者stmt关闭时,出现了异常,那么conn的close()就不能执行了,那么就会存在着浪费资源的问题。也就是说这个例子这样写是有问题的。
这个时候我们就会想到用finally来执行ResultSet, Statement, Connection的close()操作,在finally中,肯定能执行这些close()操作。
例2:
void test(){ Connection conn = null; Statement stmt = null; ResultSet rset = null; try{ conn = ...; stmt = ...; rset = ...; ... } catch(Exception e){ e.printStackTrace(); } finally{ if(rset!=null)rset.close(); if(stmt!=null)stmt.close(); if(conn!=null)conn.close(); } }
有人认为这下终于安全了,不会存在资源浪费的情况了。
其实很多人都是这么认为的,但是在finally里close的时候,也是会抛出异常的。如果在执行if(stmt!=null)stmt.close(); 出现了异常,那么conn.close()是不会执行的,finally{}不能完全执行结束。这样写还是有可能出现问题的。
所以就需要对上面的例2再进行改造:
例3:
void test(){ Connection conn = null; Statement stmt = null; ResultSet rset = null; try{ conn = ...; stmt = ...; rset = ...; ... } finally{ try{ if(rset!=null)rset.close(); }catch(Exception e){ e.printStackTrace(); } try{ if(stmt!=null)stmt.close(); }catch(Exception e){ e.printStackTrace(); } try{ if(conn!=null)conn.close(); }catch(Exception e){ e.printStackTrace(); } } }
这样就可以解决因为异常而存在浪费资源的问题了。一般的Exception通过例3都能解决这些问题。
但是除了Exception,我们的程序还会碰到Error,那么上面这个例子是否也能处理Error呢?众所周知,Error代表不可恢复错误,是程序无法处理的错误,所以我们也处理不了这种Error。所以在finally里执行stmt.close()时,如果出现Error,那么conn.close()还是不会被执行的。finally还是不能执完全行结束。那我们遇到Error时,该怎么处理里?
这里我们可以把Error转成Exception或者RuntimeException,然后抛出,再做处理。因为对于一个应用系统来说,系统所发生的任何异常或者错误对操作用户来说都是系统"运行时"异常,都是这个应用系统内部的异常。这也是将Error转成Exception或者RuntimeException的指导原则(当然也可以将Exception-->RuntimeException)。
①:Error到Exception:将错误转换为异常,并继续抛出。例如Spring WEB框架中,将org.springframework.web.servlet.DispatcherServlet的doDispatch()方法中,将捕获的错误转译为一个NestedServletException异常。这样做的目的是为了最大限度挽回因错误发生带来的负面影响。因为一个Error常常是很严重的错误,可能会引起系统挂起。
②:Exception到RuntimeException:将检查异常转换为RuntimeException可以让程序代码变得更优雅,让开发人员集中经理设计更合理的程序代码,反过来也增加了系统发生异常的可能性。
③:Error到RuntimeException:目的还是一样的。把所有的异常和错误转译为不检查异常,这样可以让代码更为简洁,还有利于对错误和异常信息的统一处理。
所以例3总的来说,还是存在着一些问题,这样对于上面的例3我们又需要进行程序的修改(在例4中就不介绍Error与Exception或者RuntimeException的转换了):
例4:
void test(){ final Connection conn = ...; try{ final Statement stmt = ...; try{ final ResultSet rset = ...; try{ ... }catch(Exception e){ e.printStackTrace(); }finally{rset.close();} }catch(Exception e){ ... }finally{stmt.close();} }catch(Exception e){ ... }finally{conn.close();} }
这样每建立一个需要清理的资源,就用一个try-catch-finally来保证它可以被清理掉。当然了,在执行close操作的时候,我们必须要注意close的次序。通过例4你会发现,close的次序问题好像已经被解决了,不用去考虑这个问题了。
=====================================================================================================
在Java里finally子句的处理还有其他诡异的地方。比如:它可以改写返回值。
如下所示:
public class Test { public static void main(String[] args) { System.out.println(ret(-1)); System.out.println(ret(1)); } private static boolean ret(int i) { try { if (i < 0) { return false; } else { return true; } }catch (Exception e) { // TODO: handle exception }finally{ return false; } } }
两次的返回结果都是:false。其实在调用ret(1)的时候,按道理应该返回true,但是就因为finally里的return操作改写了返回值。所以一般情况下,finally里不会return。
=====================================================================================================
其实在例4中还是存在着一些小问题的:
void test(){ final Connection conn = ...; try{ final Statement stmt = ...; try{ final ResultSet rset = ...; try{④ ...③ }catch(Exception e){① e.printStackTrace();② }finally{ rset.close();⑤ } }catch(Exception e){ ... }finally{stmt.close();} }catch(Exception e){ ... }finally{conn.close();} }
①: 这里应该指定具体的异常,而不提倡用一个catch(Exception e)语句捕获所有的异常。
catch语句表示我们预期会出现某种异常,而且希望能够处理该异常。异常类的作用就是告诉Java编译器我们想要处理的是哪一种异常。
在这段程序中,最明显的一个就是SQLException,这是JDBC操作中常见的异常。所以我们在捕获这个异常的时候最好能说明具体是那个异常。
如果这try块中有多个异常产生,那么最好是通过多个catch来捕获不同的异常,而不是为了图省事,就用一个catch(Exception e)语句捕获所有的异常。
②:这里异常丢弃了,因为调用一下printStackTrace算不上“处理异常”,调用printStackTrace对调试程序有帮助,但程序调试阶段结束之后,printStackTrace就不应再在异常处理模块中担负主要责任了。
所以在异常处理的时候针对具体异常采取具体行动,例如修正问题、提醒某个人或进行其他一些处理,要根据具体的情形确定应该采取的动作。 认为自己不能处理的一场,可以重新抛出异常也不失为一种选择,或者把该异常转换成另一种异常(可以把一个低级的异常转换成应用级的异常)。
③:如果在这个地方进行数据循环输出,而在循环输出时抛出了异常,那么循环的执行就会被打断的,这样就会导致用户将收到一份不完整的(或者错误的)数据,但却得不到任何有关这份数据是否完整的提示。对于有些系统来说,数据不完整可能比系统停止运行带来更大的损失。
这个时候就要在处理异常的时候向输出设备写一些信息,声明数据的不完整性;另一种可能有效的办法是,先缓冲要输出的数据,准备好全部数据之后再一次性输出,如下所示:
catch(SQLException sqlex) { out.println("警告:数据不完整"); throw new SQLException("读取数据时出现SQL错误", sqlex); }
④:try块不要过于庞大
把大量的语句装入单个巨大的try块就象是把所有东西就扔到一个大箱子,不能是吃的,还是用的,虽然东西是带上了,但要找出来却不容易。
⑤:其实应该跟例3一样
finally{ try{ if(rset!=null)rset.close(); }catch(Exception e){ e.printStackTrace(); } }
发表评论
-
MyEclipse 6.0.1 注册码【注册机】
2013-02-05 10:44 8MyEclipse 6.0 注册机 一、从附件中下载文件 ... -
【转】Flash图表AnyChart应用教程九:创建图表模板
2012-12-14 09:34 1221创建 AnyChart 模板的思路是分离图表设置和数据部分,然 ... -
【转】Flash图表AnyChart应用教程八:创建向下钻取仪表盘
2012-12-14 09:34 1210用 AnyChart 创建向下钻取地图有两种方式:用AnyCh ... -
【转】Flash图表AnyChart应用教程七:自定义轴标签
2012-12-14 09:33 1313AnyChart 图表中的X,Y和任意轴可以自定义标签。本文就 ... -
【转】Flash图表AnyChart应用教程六:创建圆形仪表
2012-12-14 09:33 2075本教程将为你详细解析 ... -
【转】Flash图表AnyChart应用教程五:字体设置
2012-12-13 10:11 1512要设置AnyChart 图表上的字体,可以对AnyChart的 ... -
【转】Flash图表AnyChart应用教程四:如何改变轴标签属性
2012-12-13 10:08 1440有人问到如何自定义AnyChart 图表的轴标签属性,实际上, ... -
【转】Flash图表AnyChart应用教程三:在网页中嵌入flash地图
2012-12-13 10:06 1806AnyChart 是一款灵活的基于Flash/JavaScri ... -
【转】Flash图表AnyChart应用教程二:修改XML设置转换图表类型
2012-12-13 10:02 1097我们都知道,运用flash图表控件 AnyChart 可以创建 ... -
【转】Flash图表AnyChart应用教程一:创建交互式数字仪表盘
2012-12-13 09:51 1645仪表盘是商业智能领域必不可少的一个工具,然而大多数企业仪表盘目 ... -
Java调用com组件操作word
2010-03-30 20:40 5080一、准备工作 先了解一下概念,JACOB 就是 JAVA ... -
JAVA类包搜索引擎
2009-08-12 15:14 1920由于项目开发过程中遇到缺少某个class文件对 ... -
url 加密
2009-08-03 16:11 9689今天我有个朋 ... -
Java串口通信总结
2009-07-31 11:03 6097最近在研 ... -
java异常集说明
2009-03-09 16:39 1496算术异常类:ArithmeticExe ... -
一个有趣的问题
2009-02-23 09:24 796今天早上过来就看到有人提了这么一个有趣的问题: 有 ... -
开源网站内容管理系统——OpenCms
2009-01-07 15:51 3888之前给客户做 ... -
Java Clone详述
2008-12-17 14:13 1106经常听到有人说java中没 ... -
MessageDigest对密码进行加密
2008-12-17 14:02 2377通常情况下我们必须把用户密码存放到数据库,为了安全起见,我们需 ... -
用Java实现几种常见的排序算法
2008-12-16 14:21 1217用Java语言实现的各种排序,包括插入排序、冒泡排序、选择排序 ...
相关推荐
类似地,Java自动的“无用单元收集”预防存储漏泄和其它有关动态存储分配和解除分配的有害错误。Java解释程序也执行许多运行时的检查,诸如验证所有数组和串访问是否在界限之内。 异常处理是Java中使得程序更稳健的...
答:异常处理是指在程序执行过程中遇到错误时进行处理的机制。Java中使用try-catch语句来捕获异常并进行处理。 7. 什么是Java中的泛型? 答:泛型是Java中一种参数化类型的概念,允许在编译时期检查类
异常处理:包括异常的分类、try-catch-finally块的使用、自定义异常等异常处理的相关内容。 多线程编程:涉及线程的创建、同步与互斥、线程池、线程间通信等多线程编程的知识。 IO操作:包括文件读写、字符流和...
JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...
再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 finalize?方法名。Java 技术允许使用 finalize() 方法在...
第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 if语句的嵌套 71 4.2.3 if-else语句 73 4.2.4 if-else语句嵌套 75 4.3 ...
6java异常处理 throw和throws、try和catch;自定义异常类;使用finally;使用异常的技巧和原则; 7 IO输入输出流 获取文件的基本信息;列出指定目录下的文件,并可过滤文件;创建文件和目录;删除文件和目录;移动...
第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 if语句的嵌套 71 4.2.3 if-else语句 73 4.2.4 if-else语句嵌套 75 4.3 ...
[第66节] 1.8.3 使用try-catch-finally处理异常2 [第67节] 1.8.4 多个catch语句的使用1 [第68节] 1.8.4 多个catch语句的使用2 [第69节] 1.8.5 throws关键字的使用1 [第70节] 1.8.5 throws关键字的使用2 [第71节] ...
Java 执行控制流程条件语句 if 条件语句 if...else 条件语句if...else if 多分支语句switch 多分支语句 循环语句 while 循环语句do...while 循环for 循环语句 跳转语句 break 语句 continue 语句面向对象 类也是-种...
在程序设计中,进行异常处理是非常关键和重要的一部分。一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度。
面试题包括以下十九部分:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql...
在 java 语言中,Java 程序的基本单位是类,也就是说:一个 Java 程序是由多个类组成 的。定义一个类与定义一个数据类型是有区别的。在程序设计语言中,把定义数据类型的能 力作为一种很重要的能力来对待。在面向...
java面试试题 全面 准确 带答案 coreJava部分 8 1、面向对象的特征有哪些方面? 8 2、作用域public,private,protected,以及不写时的区别? 8 3、String 是最基本的数据类型吗? 8 4、float 型float f=3.4是否正确? 8 ...
43、Java中的异常处理机制的简单原理和应用。 28 44、请写出你最常见到的5个runtime exception。 28 45、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出...
finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 16、sleep...
43、Java中的异常处理机制的简单原理和应用。 28 44、请写出你最常见到的5个runtime exception。 28 45、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出...
理解和应用Java异常,常用类,IO,集合和多线程等开发技术。 课时安排 总学时:52学时 授课:48学时 (含约20学时实验) 考试:4学时 预备知识 了解和使用操作系统,...
76.4. 在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件中? 86 76.5. 在weblogic中发布ejb需涉及到哪些配置文件 87 76.6. 如何在weblogic中...
43、Java中的异常处理机制的简单原理和应用。 28 44、请写出你最常见到的5个runtime exception。 28 45、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出...