学习中的菜鸟之异常处理

秋高气爽的今天(嗯.. 今天是哪天呀),我用我近视的眼睛正在看某些该看的东西(别误会,那是老师留的另一个作业),突然宿舍的某某同学说老师在催blog文章了。

本来计划要看那些非常吸引我,让我激动万分的。。。。。网上的一些内容的我,为了解决这个异常 临时决定顶住全宇宙的压力先写blog文章再那啥那啥。(嗯。就是这样)

就像 生活中难免有些意外一样,程序中也会有一些意外的情况导致程序中断,而这些意外的情况就是程序中的异常。

异常的定义    课本版:在程序的运行过程中所发生的不正常的事件,如。。。各种错误等。异常会中断正在运行的程序

程序员就是写可以运行的程序的,异常居然干掉了程序(让程序中断-_-!)!!!!!

这不是砸人饭碗么。必须跟它分个高下了。

5大绝招 之     try   catch   finally    throw    throws

作用为:

throw:在方法体内 抛出异常对象,且只能是一个。      //可以单独使用

throws:在方法的参数列表后面 ,声明方法抛出了异常 ,后面可以跟多个异常的类型。     //不可以单独使用

try-catch-finally一般连用,catch 和finally为可选,但至少有一个。

try:放置有可能出现异常的代码,,如一切正常  则不抛出异常,如出现不合理并且没有用判断限制的情况 抛出异常

catch(异常类型 ):捕获异常,如没有异常不被执行。     注:catch块要捕获异常需要声明的异常类型与发生的异常相符,catch可以有多个,子类在父类的前面(类型相容,作用面积大的那个在后面)。

finally:无论是否有异常或者任何 ( 除退出java虚拟机System.exit(1)  )情况都会被执行。

异常类型的简单架构 课本版  :

                (图为引用网上)

Throwable:异常类的基类

Error : 严重错误类,一般由虚拟机抛出。这种错误我们除了尽量让程序安全退出外,没有太好的办法(我没有)

Exception :由java程序抛出的异常的直接父类

RuntimeException:运行时错误,不要求程序必须进行异常处理,如出现异常,会终止程序。

Checked异常:非运行时错误,要求必须进行异常处理,否则连编译都无法通过。

常见的几个异常类型:

ArithmeticException:算术错误

ArrayIndexOutOfBoundsException:下标越界

NullPointerException:未将对象实例化 ,或对象为null

InputMismatchException:欲得到的数据类型与实际输入的数据类型不匹配

I(i)  ll(L)egalArgumentException:方法具有非法的参数

ClassCastException:对象强制类型转换出错

NumberFormatException:数字格式 转换异常

ClassNotFoundException:不能加载所需的类

下面是老师总结的几种使用try-catch-finally的情况

1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,
而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),
所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
举例:
情况1:try{} catch(){}finally{} return;
显然程序按顺序执行。
情况2:try{ return; }catch(){} finally{} ;
程序执行try块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,最后执行try中return;
finally块之后的语句return,因为程序在try中已经return所以不再执行。
情况3:try{ } catch(){return;} finally{} return;
程序先执行try,如果遇到异常执行catch块,
有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,
最后执行catch块中return. finally之后也就是4处的代码不再执行。
无异常:执行完try再finally再return.
情况4:try{ return; }catch(){} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,因为finally块中有return所以提前退出。
情况5:try{} catch(){return;}finally{return;}
程序执行catch块中return之前(包括return语句中的表达式运算)代码;
再执行finally块,因为finally块中有return所以提前退出。

情况6:try{ return;}catch(){return;} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码;
有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;
则再执行finally块,因为finally块中有return所以提前退出。
无异常:则再执行finally块,因为finally块中有return所以提前退出。

最终结论:任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。
如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,
编译器把finally中的return实现为一个warning。

下面请看一个面试题做为结尾:

public class FinallyTest
                            {
                                   public static void main(String[] args) {

System.out.println(new FinallyTest().test());;
                                    }

static int test() {
                                                                      
                                           int x = 1;
                                                try
                                               {
                                                        x++;
                                                        return x;
                                               }
                                               finally
                                               {
                                                         ++x;
                                               }
                                   }
                           }

这题的结果是2。

前边不是说了,只要程序不中断,finally一定会执行么,那么为什么不是3呐?

原因是:finally块虽然会被执行,但是如例所示try块或者catch块中有了return,那么当时要返回的值已经在进入finally之前就确定了,再finally块里就算改变了变量的值,返回的值也不会改变。(如果return的值是固定的如常量或直接就是一个值那么程序不会先到ruturn语句,如为变量是不固定的值那会先到ruturn语句确定了值后再执行finally块的代码)

时间: 2024-08-02 21:30:27

学习中的菜鸟之异常处理的相关文章

linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)

errno 在unix系统中对大部分系统调用非正常返回时,通常返回值为-1,并设置全局变量errno(errno.h),如socket(), bind(), accept(), listen().erron存放一个正整数来保存上次出错的错误值. 对线程而言,每个线程都有专用的errno变量,不必考虑同步问题. strerror converts to English (Note: use strerror_r for thread safety) perror is simplified str

java学习中,异常和错误的简介、捕获异常、抛出异常、自定义异常(java 学习中的小记录)

java学习中,异常和错误的简介.捕获异常.抛出异常.自定义异常(java 学习中的小记录)作者:王可利(Star·星星) 异常:(API 的 java.lang 有一个异常,有很多很多) 在Java程序中也会程序出现不正常的情况,这个就叫异常.     Java是面向对象的语言,任何事物都可以用类来描述,同样的异常也是一种事物.Java中提供了很多的异常类.     多个异常堆积起来,就是一个异常体系.   Throwable:是异常类的父类,超类.Exception 异常.error错误.

学习中专业基础与应用技术间的取舍

[来信] 老师 你好,已经学了快一个月的数据结构与算法了,平时还是以看书为主,然后在网上找一些相关的题目练手.有一个疑惑就是周围的同学有的正在学QT,MFC以便做出图形界面,想问下老师如何在基本功与这些技术中做出取舍. [回复] 我想,基本功训练和具体技术之间,不是取舍的问题.作为低年级的大学生,前者是必须要做的事,后者是可以在多种方案中做出选择的事.前者如喝水,必须要有,后者如吃面条,其实吃米饭也可以替代. 如果你能沉得住气,既然已经做了学数据结构和算法的计划,就将之坚持下来,合适的时间再学应

编程学习中要注意效率和感受

早一个多月,收到了一位网友的求助信,请我帮他做一道程序题.这样的求助我是不会直接解答的.如果要想通过读程序来学习,可读的程序太多了,不在乎由我写的这一段程序. 我给他的回信是,他可以自己做出来一个版本,无论对错,我们就他的做法进行讨论.这是我认为有效的交流.提问者没有做,靠着人给讲,这种学习方式,可以休矣.无论对错.好坏,他自己做过了,针对他自己的讨论点就出来了.我当时的答复是: 我的时间有限,将你做过的给我发来,并提出具体问题再讨论为佳.在学习中,这种交流的方式(有一个问题,不说自己的见解,直

Java语言中的----多态和异常处理

day13 Java语言中的----多态和异常处理 一.概述: 学习Java语言就要理解Java中的面向对象的四大特征:分别是封装.抽象.继承.多态.前面三个我们已经学完了,下面我们来学一下多态.什么是多态?不明思议就是具有两种形态性,一个方法可以定义两种形态,这就是方法的多态性.同时我们还会学习到什么是方法重载.和方法签名. 异常处理就是在编译的时候需要我们手动的去处理一下编译都不能够通过的程序.使用try {} catch{}结构就可以处理异常. 二.多态: 1.所有类的基类是object,

C++语言学习(十八)——异常处理

C++语言学习(十八)--异常处理 一.C语言异常处理 异常是指程序在运行过程中产生可预料的执行分支.如除0操作,数组访问越界.要打开的文件不存在.Bug是指程序中的错误,是不被预期的运行方式.如野指针.堆空间使用结束未释放.C语言中处理异常的方式一般是使用if....else...分支语句. double divide(double a, double b) { const double delta = 0.000000000000001; double ret = 0; if( !((-de

学编程,学单词.....在学习中积累自己的单词(不断更新__ing)

可以去肆意大话天下,可以去小民一般的言语,但是一定要清楚,知识的积累,至于心中,这样,你才能低至市井,上至高阁....畅通无阻! 1.  Loowater  厕所水 , Loo 盥洗室 学编程,学单词.....在学习中积累自己的单词(不断更新__ing),布布扣,bubuko.com

JAVA中的异常(异常处理流程、异常处理的缺陷)

异常处理流程 1)首先由try{...}catch(Exception e){ System.out.println(e); e.printStackTrace(); }finally{...}结构 2)当JVM遇到异常时,会产生一个Exception对象 或 继承自Exception的子类的对象. 3)将异常对象向上层(调用它的代码块)抛出,知道碰到一个catch块(作相应处理) 或 一直抛到了最外层(导致程序异常终止).(并停止异常之后的代码的执行,但是finally块中的代码还会执行!换句

MFC学习中遇到的小问题和解决方案

1 清除combox里面的内容((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent();//消除现有所有内容2 如何获取鼠标指针的位置GetWindowRect 详情见657面 超市管理系统 3 如何获取combox下拉列表的索引:int selgetcursel;getlbtext; 4 选中某行某列值并修改SetItemText 5 单击选中listcontrol控件某行右键 添加一个菜单 并触发事件 (见该网页第15条记录) http:/