求一个c 异常处理 例子的例子再java中

java文件里有多个异常,用try-catch处理时有一段代码直接忽略了,调试时没有异常显示,怎么改,求指教怎么改
[问题点数:20分,结帖人u]
java文件里有多个异常,用try-catch处理时有一段代码直接忽略了,调试时没有异常显示,怎么改,求指教怎么改
[问题点数:20分,结帖人u]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年10月 总版技术专家分月排行榜第三
2014年3月 Java大版内专家分月排行榜第一2014年1月 Java大版内专家分月排行榜第一2013年12月 Java大版内专家分月排行榜第一2013年11月 Java大版内专家分月排行榜第一2013年10月 Java大版内专家分月排行榜第一
2013年10月 总版技术专家分月排行榜第三
2014年3月 Java大版内专家分月排行榜第一2014年1月 Java大版内专家分月排行榜第一2013年12月 Java大版内专家分月排行榜第一2013年11月 Java大版内专家分月排行榜第一2013年10月 Java大版内专家分月排行榜第一
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。&&&&&&正文
JAVA中的异常处理
摘要:JAVA中的异常处理,在JAVA中,异常对象都是派生于Throwable类的一个实例。
在JAVA中,异常对象都是派生于Throwable类的一个实例。Throwable -& ErrorThrowable -& Exception -&IOException or Runtime Exception派生于Runtime Exception类或Error类的所有异常称为未检查异常,其他异常称为已检查异常声明已检查异常public FileInputStream(String name) throws FileNotFoundException如果可能抛出多个已检查异常,就必须在方法的首部列出所有异常类,每个异常类之间用,隔开但不要声明从Error继承的异常。如果子类方法覆盖了超类的方法,那么子类方法中声明的已检查异常不能超过超类方法声明的异常范围。抛出异常的方法:throw new EOFException找到一个合适的异常类,创建这个类的一个对象,将对象抛出。 捕获异常的方法:try { code }catch (Exception e){ handler }可以有多个catch语句块, catch语句中也可以再次抛出异常需要释放资源时, 可以用finally语句块实现, 还有一种常见的结构:try{ &try { code } &finally ({free code }}catch (IOException e){ code }我就是一个菜鸟!
全国校区查询
案例分析点击榜
案例分析最新文章
官方新版意见收集
*您的积极反馈是我们前进的动力
官方新版意见收集
提交成功,感谢您的反馈。
我们会认真阅读和考虑每个用户的反馈。java中try-catch-finally异常处理例子 | 一聚教程网
java中try-catch-finally异常处理例子
这一小节概述了try--finally 语句是怎样处理错误的,文中的例子是Java的,但是同样的规则也适用于C#。java和C#中异常的唯一区别就是C#中没有已检查异常。已检查异常和未检查异常将在后面小节更加详细地介绍。
程序中的异常表明一些错误或者异常情况发生了,异常如果没有被处理,继续程序流程是没有意义的。一个方法可能会因为各种原因抛出异常,比如输入参数是无效的(当期待获得正数时输入了负数等。)
下面介绍调用栈。调用栈是指从当前的方法开始一直到main方法处的方法调用序列。如果方法A调用方法B,方法B调用方法C,则调用栈如下所示:
当方法C返回后,调用栈仅仅包含A和B,如果方法B再调用方法D,则调用栈如下所示:
理解调用栈对理解异常传播是非常重要的。从抛出异常的方法开始,异常根据调用栈传播,直到调用栈中某个方法捕获该异常。更多细节稍后讨论。
如果一个方法要抛出异常,那么要在方法签名中声明这个异常,然后在方法里包含一条throw语句。下面是一个例子:
&&& public void divide(int numberToDivide, int numberToDivideBy)
&&& throws BadNumberException{
&&&&&&& if(numberToDivideBy == 0){
&&&&&&&&&&& throw new BadNumberException("Cannot divide by 0");
&&&&&&& return numberToDivide / numberToDivideBy;
当一个异常被抛出时,方法在抛出异常处停止运行。throw语句后的任何语句都将不会被执行了。在上面这个例子中,如果抛出BadNumberException异常,那么&return numberToDivide / numberToDivideBy;&这条语句将不会被执行。当异常被catch语句块捕获时,程序才会继续执行。捕获异常稍后解释。
只要在方法签名中做了声明,你可以抛出任何异常。你也可以创建自己的异常。异常是继承自java.lang.Exception的标准java类或者任何其他的内置异常类。如果一个方法声明抛出异常A,那么方法抛出异常A的子类异常也是合法的。
如果一个方法调用了另一个会抛出已检查异常的方法,那么这个调用方法必须要么传递这个异常,要么捕获这个异常。捕获异常是利用try-catch语句块来实现的。下面是一个例子:
&&& public void callDivide(){
&&&&&&& try {
&&&&&&&&&&& int result = divide(2,1);
&&&&&&&&&&& System.out.println(result);
&&&&&&& } catch (BadNumberException e) {
&&&&&&&&&&& //do something clever with the exception
&&&&&&&&&&& System.out.println(e.getMessage());
&&&&&&& System.out.println("Division attempt done");
当抛出异常时,catch语句中的BadNumberException 类型参数e就代表从divide方法中抛出的异常。
如果try语句块中任何被调用的方法和执行的语句都没有抛出异常,catch语句块仅仅被忽略,不会被执行。
如果try语句块中抛出异常,例如在divide方法中抛出异常,调用方法(即callDrive方法)中的程序流将会像divide方法中的程序流一样被中断。程序流将在调用栈中某个能够捕获这个异常的catch语句块处恢复。上面例子中,如果一个异常从divide方法中抛出,那么&System.out.println(result);& 语句将不会被执行。这时程序将会在catch (BadNumberException e) { }语句块里恢复执行。
如果在ctach语句块里抛出了一个没有被捕获的异常,那么catch语句块的运行将会像try语句中块抛出异常一样被中断。
当catch语句块执行完,程序将会执行catch语句块后面的所有语句。上面例子中的&System.out.println(&Division attempt done&);& 语句将永远会被执行。
你也没有必要捕获其他方法中抛出的异常。如果你在方法抛出异常的地方不能对异常做任何事,你可以让方法根据调用栈将这个异常传播到调用这个方法的其他方法处。如果你这样做,调用这个将抛出异常方法的其他方法必须要在方法签名中声明抛出这个异常。下面是callDivide()方法在这种情况下的例子:
public void callDivide() throws BadNumberException{
&&&&&& int result = divide(2,1);
&&&&&& System.out.println(result);
注意try-catch语句块不见了,callDivide 方法声明它会抛出一个BadNumberException异常。如果divide方法里抛出一个异常,程序仍将被中断。因此如果divide方法里抛出一个异常,&System.out.println(result);& 语句将不会被执行。但是这样的话callDivide 方法中(因为抛出异常而中断的的)程序执行不会被恢复。异常会被传播到调用callDivide的方法中。直到调用栈中的某个catch语句块捕获了这个异常,程序执行才会恢复。根据调用栈,从抛出异常的方法到捕获异常的方法之间的所有方法的运行都将停止在异常抛出或者传播的代码处。
捕获IOException示例
如果一个异常在try语句块中被抛出,程序的顺序执行将会被中断,控制流将直接跳转到catch语句块。代码将会因为异常在几个地方被中断:
public void openFile(){
&&&&&&& try {
&&&&&&&&&&& // constructor may throw FileNotFoundException
&&&&&&&&&&& FileReader reader = new FileReader("someFile");
&&&&&&&&&&& int i=0;
&&&&&&&&&&& while(i != -1){
&&&&&&&&&&&&&&& //reader.read() may throw IOException
&&&&&&&&&&&&&&& i = reader.read();
&&&&&&&&&&&&&&& System.out.println((char) i );
&&&&&&&&&&& }
&&&&&&&&&&& reader.close();
&&&&&&&&&&& System.out.println("--- File End ---");
&&&&&&& } catch (FileNotFoundException e) {
&&&&&&&&&&& //do something clever with the exception
&&&&&&& } catch (IOException e) {
&&&&&&&&&&& //do something clever with the exception
如果reader.read()方法调用抛出一个IO异常,下面的System.out.println((char) i );语句不会被执行。最后的reader.close() 和System.out.println(&& File End &&);语句也不会被执行。程序直接调转到catch(IOException e){ & }语句块处。如果new FileReader(&someFile&); 构造器中调用抛出一个异常,那么try语句块中的代码都不会被执行了。
传播IOException示例
下面的代码仍然以上面的方法为例,不过这里没有捕获异常:
public void openFile() throws IOException {
&&&&&&& FileReader reader = new FileReader("someFile");
&&&&&&& int i=0;
&&&&&&& while(i != -1){
&&&&&&&&&&& i = reader.read();
&&&&&&&&&&& System.out.println((char) i );
&&&&&&& reader.close();
&&&&&&& System.out.println("--- File End ---");
如果reader.read()& 方法抛出一个异常,程序将会停止运行,异常根据调用栈传播到调用openFile()方法的方法处。如果这个调用方法有try-catch语句块,异常将在这里被捕获。如果这个调用方法也只是抛出异常,这个调用方法的运行将在调用openFile()方法处中断,异常根据调用栈往外传播。异常就是这样根据调用栈往外传播,直到某个方法或者java虚拟机捕获了这个异常。
你也可以在try-catch语句块后增加一个finally语句块。不论try还是catch语句块中抛出异常,finally语句块中的代码将永远执行。如果代码里的try或者catch语句块中有个return语句,finally语句块中的代码将会在方法返回之前执行。finally示例见下:
public void openFile(){
&&&&&&& FileReader reader =
&&&&&&& try {
&&&&&&&&&&& reader = new FileReader("someFile");
&&&&&&&&&&& int i=0;
&&&&&&&&&&& while(i != -1){
&&&&&&&&&&&&&&& i = reader.read();
&&&&&&&&&&&&&&& System.out.println((char) i );
&&&&&&&&&&& }
&&&&&&& } catch (IOException e) {
&&&&&&&&&&& //do something clever with the exception
&&&&&&& } finally {
&&&&&&&&&&& if(reader != null){
&&&&&&&&&&&&&&& try {
&&&&&&&&&&&&&&&&&&& reader.close();
&&&&&&&&&&&&&&& } catch (IOException e) {
&&&&&&&&&&&&&&&&&&& //do something clever with the exception
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& System.out.println("--- File End ---");
不论try或者catch语句块中是否有异常抛出,finally语句块中的代码都将被执行。这个例子表明不论try、catch语句块中的程序运行情况如何,文件读取始终会被关闭。
注意:如果finally语句块中抛出一个异常,并且没有被捕获,finally语句块就像try、catch语句块抛出异常一样也会被中断运行。这就是为什么上面的例子中finally语句块中的reader.close() 方法也被try-catch语句块包裹原因:
} finally {
&&&&&&&&&&& if(reader != null){
&&&&&&&&&&&&&&& try {
&&&&&&&&&&&&&&&&&&& reader.close();
&&&&&&&&&&&&&&& } catch (IOException e) {
&&&&&&&&&&&&&&&&&&& //do something clever with the exception
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& System.out.println("--- File End ---");
通过这样,System.out.println(&& File End &&);语句将会永远被执行。更准确地说是没有未检查异常被抛出时是这样。更多关于已检查异常和未检测异常的知识将在后面章节介绍。
你的程序中不需要同时又catch、finally语句块。try语句块后可以仅仅有catch语句块或者finally语句块,但是try语句块后既没有catch语句块也没有finally语句块是不行的。下面的代码不会捕获异常而是让异常根据调用栈往外传播,但是由于finally语句块的存在,即是有异常抛出,程序仍旧能关闭打开的文件。
public void openFile() throws IOException {
&&&&&&& FileReader reader =
&&&&&&& try {
&&&&&&&&&&& reader = new FileReader("someFile");
&&&&&&&&&&& int i=0;
&&&&&&&&&&& while(i != -1){
&&&&&&&&&&&&&&& i = reader.read();
&&&&&&&&&&&&&&& System.out.println((char) i );
&&&&&&&&&&& }
&&&&&&& } finally {
&&&&&&&&&&& if(reader != null){
&&&&&&&&&&&&&&& try {
&&&&&&&&&&&&&&&&&&& reader.close();
&&&&&&&&&&&&&&& } catch (IOException e) {
&&&&&&&&&&&&&&&&&&& //do something clever with the exception
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& System.out.println("--- File End ---");
注意上面catch语句块不见了。
捕获异常还是传播异常?
你可能疑问:程序中抛出的异常是应该捕获还是让其传播?这取决于具体情况。在许多应用程序中,除了告诉用户请求操作失败,你不能对异常做其他更多事情。在这种情况下,你可以在调用栈中的第一个方法里捕获所有的、或者大多数的异常。在传播异常时,你仍然可以处理异常(通过finally语句)。比如,在一个web应用程序中的连接出现了错误,即使你所能做的只是告诉用户这个操作失败,你仍然应该在finally语句中关闭这个数据库连接。最终如何处理异常也取决于你的程序中抛出的是已检查异常还是未检查异常。关于已检查异常、未检查异常,后面将有更多文章介绍。理解Java异常处理机制DDJava异常处理的一个综合实例相关文章推荐 - 24小时学习网
欢迎您来到24小时学习网!!!
相关文章推荐:理解Java异常处理机制DDJava异常处理的一个综合实例
发布日期: 点击:(9)
声明抛出异常如果程序员不想在当前方法内处理异常,可以使用throws语句声明将异常抛出到调用方法中。调用方法也可以将异常再抛给其他调用方法。如果所有的方法都选择了抛出此异常,最后Java虚拟机将捕获它,输出相关的错误信息,并终止程序的运行。在异常被抛出的过程中,任何方法都可以捕获异常并进行相应的处理。捕获异常捕获异常需要使用try、catch、finally构成的语句块。try语句块中是可能抛出异常的代码,如果一条语句抛出了异常,其后续语句不会继续执行,而是转到catch进行异常类型匹配。catch语句块负责捕获指定类型的异常并进行处理。finally语句块是可选的,一般用于释放资源,无论是否发生异常,finally语句块总会执行。由于继承,在有多个异常需要捕获时,异常类型的顺序很重要。getMessage()方法返回一个对发生的异常进行描述的字符串。printStackTrace()方法打印方法的调用序列,一直到异常的产生位置。
1 引子 try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解。不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单、听话。不信?那你看看下面的代码,“猜猜”它执行后的结果会是什么?不要往后看答案、也不许执行代码看真正答案哦。如果你的答案是正确,那么这篇文章你就不用浪费时间看啦。 package myExample.testE public class TestException { public TestException() { } boolean testE
发布日期: 点击:(670)
8.2.2 声明异常(throws)在某些情况下,如果一个方法产生自己不处理或无法处理的异常,它就必须在throws子句中声明该异常。也就是说,在Java语言中如果在一个方法中生成了一个异常,但是这一方法并不确切地知道该如何对这一异常事件进行处理,这时,这个方法就应该声明抛弃异常,使得异常对象可以从调用栈向后传播,直到有合适的方法捕获它为止。throws关键字是用在方法声明中,用来列出从方法中发出的、非起源于Error或RuntimeException中的任何异常。能够主动引发异常的方法必须用throws来声明。通常使用Java预定义的异常类可以满足程序开发者的编程需要。
发布日期: 点击:(818)
很久没弄Java了,但里面重要的东西我还是记得的,比如什么面向对象的思想,继承、封装、多态。还是记得的,我不能说我Java学的如何如好,但基本的思想我理解的比较到位的。可能写程序就要成问题了,光有思想史部行的,还要把思想运用到实际的程序中,那样的话理解可能还要深刻些,每种技术,不论多么简单的技术还是要自己都练习练习才有可能取得比较好好的成绩,而且还要经常练习才行,不要一种技术很久不练那可能等不到多久又忘了。今天就来说说Java中的异常机制,Java中的异常分为运行时异常和错误、异常又分为受检异常和非受检异常,受检异常就是有I/O操作的。里面的东西如throw、throws等就不讲了,
发布日期: 点击:(617)
1、异常的概念:程序执行过程中出现的不正常情况。2、Java中错误分为:Error和Exception。1)Error类:表示严重错误。2)Exception类:可控错误。Exception又包括编译时错误和执行时错误。3、一张图说明异常分类4、try、catch、finally块1)try块:用于捕获异常。其后可接零个或多个catch块,如果没有catch块,则必须跟一个finally块。2)catch块:用于处理try捕获到的异常。3)finally块:无论是否捕获或处理异常,finally块里的语句都会被执行。当在try块或catch块中遇到return语句时,
发布日期: 点击:(1065)
当出现程序无法控制的外部环境 问题(用户提供的文件不存在,文件内容损坏,网络不可用...)时,JAVA就会用异常对象来描述。JAVA中用2种方法处理异常:1.在发生异常的地方直接处理;2.将异常抛给调用者,让调用者处理。JAVA异常可分为3种:  (1)检查性异常:java.lang.Exception(2)运行期异常:java.lang.RuntimeException(3)错误:java.lang.Error顶层是java.lang.Throwable类,检查性异常,运行期异常,错误都 是这个类的子孙类。java.lang.Exception和java.
发布日期: 点击:(704)
对于可能出现异常的代码,有两种处理办法:第一、在方法中用try...catch语句捕获并处理异常,catach语句可以有多个,用来匹配多个异常。例如:public void p(int x){try{}catch(Exception e){}finally{}}第二、对于处理不了的异常或者要转型的异常,在方法的声明处通过throws语句抛出异常。例如:public void test1()throws MyException{if(....){ throw new MyException();}如果每个方法都是简单的抛出异常,那么在方法调用方法的多层嵌套调用中,
发布日期: 点击:(825)
1、throws关键字通常被应用在声明方法时,用来指定可能抛出的异常。多个异常可以使用逗号隔开。当在主函数中调用该方法时,如果发生异常,就会将异常抛给指定异常对象。如下面例子所示:public class Shoot { //创建类??? static void pop() ??????? throws NegativeArraySizeException { //定义方法并抛出NegativeArraySizeException异常??????????? int [] arr = new int[-3];?//创建数组????????}??? publ
发布日期: 点击:(775)
/*** 1 不能再finally块中执行return,continue等语句,否则会把异常“吃掉”; * 2 在try,catch中如果有return语句,则在执行return之前先执行fianlly块* @author Terry*/public class TryTest {public static void main(String[] args) {try {System.out.println(TryTest.test());// 返回结果为true,没有任何异常抛出} catch (Exception e) {// TODO Auto-ge
发布日期: 点击:(612)
今天,Tomcat给了我这么一个异常:java.lang.OutOfMemoryError: PermGen space。自己是第一次遇到,抱着好奇的心情google了一下,居然是个很常见的异常!故记录一下。:)原因: ????? PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collectio
发布日期: 点击:(952)
1、不能在finally块中执行return,continue等语句,否则会把异常“吃掉”;  2、在try,catch中如果有return语句,则在执行return之前先执行finally块  请大家仔细看下面的例子:以下是引用片段:public class TryTest {? ??? public static void main(String[] args) {? ??????? try {? ??????????? System.out.println(TryTest.test());// 返回结果为true其没有任何异常? ??????? }
发布日期: 点击:(477)

我要回帖

更多关于 java异常处理原则 的文章

 

随机推荐