【2014/10/12 21:40】文章待续~

1.函数自身捕获处理异常的情况

以下的样例介绍了try~catch语句中出现异常时语句的运行顺序:

package month10;

import java.lang.*;

public class TryCatch{

	/*
* 函数产生一个ArithmeticException异常
*/
public static void First(){
System.out.println("第一个异常处理的样例");
try{
//double m=5.0/0; 在java中,浮点数double和float能够除0。返回无穷大
int m=5/0;
System.out.println(m+"第一个函数不会继续执行了");
}
catch(ArithmeticException e){
System.out.println("第一个函数捕获了异常");
}
finally{
System.out.println("第一个异常处理的样例结束");
}
} /*
* 函数产生一个OutIndexOfException异常
*/
public static void Second(){
System.out.println("第二个异常处理的样例");
int[] arr=new int[3];
try{
for(int i=0;i<4;i++){
arr[i]=i;
}
}
catch(Exception e){
System.out.println("第二个函数捕获了异常");
}
finally{
System.out.println("第一个异常处理的样例结束");
}
} public static void main(String[] args) { System.out.println("程序执行開始");
First();
Second();
System.out.println("程序执行结束"); } }

运行的结果例如以下:

2. 函数自身不处理异常,抛出异常,直接外层函数处理

try抛出了异常。try语句块中抛出异常之后的语句不会再被运行。

package month10;

import java.lang.*;

public class TryCatch{

	/*
* 函数产生一个ArithmeticException异常
*/
public void First(){
System.out.println("第一个异常处理的样例");
try{
//double m=5.0/0; 在java中,浮点数double和float能够除0,返回无穷大
int m=5/0;
System.out.println(m+"第一个函数不会继续执行了");
}
catch(ArithmeticException e){
//throw用在程序中明白表示这里抛出一个异常。 后面跟一个异常对象(实例).
throw new ArithmeticException("ArithmeticException");
//后面不跟语句
}
finally{
System.out.println("第一个异常处理的样例结束");
}
} /*
* 函数产生一个OutIndexOfException异常
*/
public void Second(){
System.out.println("第二个异常处理的样例");
int[] arr=new int[3];
try{
for(int i=0;i<4;i++){
arr[i]=i;
}
}
catch(ArrayIndexOutOfBoundsException e){
throw new ArithmeticException("ArrayIndexOutOfBoundsException");
}
finally{
//上面的样例这里写的输出语句有错误
System.out.println("第二个异常处理的样例结束");
}
} /*
* 封装了First、Second
*/
public void Thrid(){
System.out.println("函数三将First/Second開始执行");
try{
First();
Second();
}
catch(Exception e){
System.out.println("接受异常"+e.getMessage());
}
System.out.println("函数三之后的语句");
} public static void main(String[] args) { System.out.println("程序执行開始");
TryCatch temp=new TryCatch();
temp.Thrid();
System.out.println("程序执行结束"); } }

函数的运行效果例如以下:

3.函数抛出异常,向上抛,外层函数处理

验证函数执行产生异常,外层函数既没有对异常进行捕获处理、亦没有声明抛出异常、异常信息是否会一直向上抛,直到被处理。

package month10;

import java.lang.*;

public class TryCatch{

	/*
* 函数产生一个ArithmeticException异常
*/
public void First(){
System.out.println("第一个异常处理的样例");
try{
//double m=5.0/0; 在java中,浮点数double和float能够除0,返回无穷大
int m=5/0;
System.out.println(m+"第一个函数不会继续执行了");
}
catch(ArithmeticException e){
//throw用在程序中明白表示这里抛出一个异常。 后面跟一个异常对象(实例).
throw new ArithmeticException("ArithmeticException");
//后面不跟语句
}
finally{
System.out.println("第一个异常处理的样例结束");
}
} /*
* 函数产生一个OutIndexOfException异常
*/
public void Second(){
System.out.println("第二个异常处理的样例");
int[] arr=new int[3];
try{
for(int i=0;i<4;i++){
arr[i]=i;
}
}
catch(ArrayIndexOutOfBoundsException e){
throw new ArithmeticException("ArrayIndexOutOfBoundsException");
}
finally{
//上面的样例这里写的输出语句有错误
System.out.println("第二个异常处理的样例结束");
}
} /*
* 封装了First、Second,
* 函数对First、Second抛出的异常不进行处理
*/
public void Thrid(){ System.out.println("函数三将First/Second開始执行");
First();
Second();
System.out.println("函数三之后的语句");
} /*
* 调用函数Thrid
*/
public void Four(){
try{
Thrid();
}
catch(Exception e){
System.out.println("函数3没有进行异常抛出,可是函数1的异常会一直向上抛,直到被捕获");
}
System.out.println("函数4之后的语句");
} public static void main(String[] args) { System.out.println("程序执行開始");
TryCatch temp=new TryCatch();
temp.Four();
System.out.println("程序执行结束"); } }

执行结果例如以下:

4.验证Checked Exception 是否也符合

上面的样例都验证的是执行时异常。不能全然说明问题。如今,验证Checked Exception。

:函数产生异常,若由函数调用者来捕获处理异常,继续之后的程序代码运行;若产生异常未捕获,异常会沿着调用栈下移,一直找到与之匹配的处理方法,若被处理。从处理的地方開始运行之后的代码;若到达调用栈底仍未找到,程序终止。

加入了CExce()函数,用于生产FileNotFoundException异常。

大家差分吧。

package month10;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.*; public class TryCatch{ /*
* 函数产生一个ArithmeticException异常
*/
public void First(){
System.out.println("第一个异常处理的样例");
try{
//double m=5.0/0; 在java中,浮点数double和float能够除0。返回无穷大
int m=5/0;
System.out.println(m+"第一个函数不会继续执行了");
}
catch(ArithmeticException e){
//throw用在程序中明白表示这里抛出一个异常。 后面跟一个异常对象(实例).
throw new ArithmeticException("ArithmeticException");
//后面不跟语句
}
finally{
System.out.println("第一个异常处理的样例结束");
}
} /*
* 函数产生一个OutIndexOfException异常
*/
public void Second(){
System.out.println("第二个异常处理的样例");
int[] arr=new int[3];
try{
for(int i=0;i<4;i++){
arr[i]=i;
}
}
catch(ArrayIndexOutOfBoundsException e){
throw new ArithmeticException("ArrayIndexOutOfBoundsException");
}
finally{
//上面的样例这里写的输出语句有错误
System.out.println("第二个异常处理的样例结束");
}
} /*
* 封装了First、Second,
* 函数对First、Second抛出的异常不进行处理
* 加入了CExce()函数
*/
public void Thrid(){ System.out.println("函数三将CExce/First/Second開始执行"); CExce();
First();
Second();
System.out.println("函数三之后的语句");
} /*
* 调用函数Thrid
*/
public void Four(){
try{
Thrid();
}
catch(Exception e){
System.out.println("函数3没有进行异常抛出。此时Checked Exception异常函数Cexce的异常自己捕获处理了异常。此时捕获First的异常");
}
System.out.println("函数4之后的语句");
} /*
*
*/
public void CExce(){
FileInputStream fis=null;
FileOutputStream fos=null;
try{
//目录下没有这个文件,会产生FileNoFoundException。 fis=new FileInputStream("C:\\Users\\acer\\Pictures\\boke\\neojos.jpg");
fos=new FileOutputStream("rt.png");
byte[] b=new byte[1024];
int count=0;
while((count=fis.read(b))!=-1){ //int read(byte[] b)
fos.write(b,0,count); //write(byte[]b,int off,int len)
}
}
catch(IOException e){
System.out.println("IO异常咯");
}
finally{
if(fis!=null){
try{
fis.close();
}
catch(IOException e){
System.out.println("error1");
}
}
if(fos!=null){
try{
fos.close();
}
catch(IOException e){
System.out.println("error2");
}
}
//System.out.println("IO over!");
}
} public static void main(String[] args) { System.out.println("程序执行開始");
TryCatch temp=new TryCatch();
temp.Four();
System.out.println("程序执行结束"); }
}

函数执行截图例如以下:

5.函数体声明抛出异常Throws

函数体声明异常,也就是在方法名后面加上throws ExceptionName,..., 方法本身仅仅是抛出异常,由函数调用者来捕获异常。若产生异常,异常会沿着调用栈下移。一直找到与之匹配的处理方法,若到达调用栈底仍未找到。程序终止。

编写代码,你会发现。

对于Throw unchecked Exception的函数,必须在函数体方法声明时追加throws xxException,否则通只是编译器。

在上面的样例中分别在CExce()和Third函数中追加。

import java.lang.*;

public class TryCatch{

	/*
* 函数产生一个ArithmeticException异常
*/
public void First(){
System.out.println("第一个异常处理的样例");
try{
//double m=5.0/0; 在java中。浮点数double和float能够除0。返回无穷大
int m=5/0;
System.out.println(m+"第一个函数不会继续执行了");
}
catch(ArithmeticException e){
//throw用在程序中明白表示这里抛出一个异常。 后面跟一个异常对象(实例).
throw new ArithmeticException("ArithmeticException");
//后面不跟语句
}
finally{
System.out.println("第一个异常处理的样例结束");
}
} /*
* 函数产生一个OutIndexOfException异常
*/
public void Second(){
System.out.println("第二个异常处理的样例");
int[] arr=new int[3];
try{
for(int i=0;i<4;i++){
arr[i]=i;
}
}
catch(ArrayIndexOutOfBoundsException e){
throw new ArithmeticException("ArrayIndexOutOfBoundsException");
}
finally{
//上面的样例这里写的输出语句有错误
System.out.println("第二个异常处理的样例结束");
}
} /*
* 封装了First、Second,
* 函数对First、Second抛出的异常不进行处理
* 加入了CExce()函数
*/
public void Thrid() throws IOException{ System.out.println("函数三将CExce/First/Second開始执行"); CExce();
First();
Second();
System.out.println("函数三之后的语句");
} /*
* 调用函数Thrid
*/
public void Four(){
try{
Thrid();
}
catch(Exception e){
System.out.println("函数3没有进行异常抛出,此时Checked Exception异常函数Cexce的异常自己捕获处理了异常。 此时捕获First的异常");
}
System.out.println("函数4之后的语句");
} /*
*
*/
public void CExce() throws FileNotFoundException{
FileInputStream fis=null;
FileOutputStream fos=null;
try{
//目录下没有这个文件,会产生FileNoFoundException。 fis=new FileInputStream("C:\\Users\\acer\\Pictures\\boke\\neojos.jpg");
fos=new FileOutputStream("rt.png");
byte[] b=new byte[1024];
int count=0;
while((count=fis.read(b))!=-1){ //int read(byte[] b)
fos.write(b,0,count); //write(byte[]b,int off,int len)
}
}
catch(IOException e){
throw new FileNotFoundException("文件未找到异常");
}
finally{
if(fis!=null){
try{
fis.close();
}
catch(IOException e){
System.out.println("error1");
}
}
if(fos!=null){
try{
fos.close();
}
catch(IOException e){
System.out.println("error2");
}
}
//System.out.println("IO over!");
}
} public static void main(String[] args) { System.out.println("程序执行開始");
TryCatch temp=new TryCatch();
temp.Four();
System.out.println("程序执行结束"); }
}

函数运行结果例如以下:

这里图片的内容仅仅是用于提示运行的流程,输出文字没有意义

try~Catch语句中异常的处理过程的更多相关文章

  1. Java异常处理中finally中的return会覆盖catch语句中的return语句

    Java异常处理中finally中的return会覆盖catch语句中的return语句和throw语句,所以Java不建议在finally中使用return语句 此外 finally中的throw语 ...

  2. 在try...catch语句中执行Response.End()后如何停止执行catch语句中的内容

    在调用Response.End()时,会执行Thread.CurrentThread.Abort()操作. 如果将Response.End()放在try...catch中,catch会捕捉Thread ...

  3. C# 中异常抛出捕获机制--throw / try,catch,finally

    try { messagebox.show("true"); } catch { messagebox.show("false"); } finally { m ...

  4. java中异常抛出后代码还会继续执行吗

    今天遇到一个问题,在下面的代码中,当抛出运行时异常后,后面的代码还会执行吗,是否需要在异常后面加上return语句呢? public void add(int index, E element){ i ...

  5. java中异常抛出后代码是否会继续执行

    为了回答这个问题,我编写了几段代码测试了一下,结果如下:  代码1:throw new Exception("参数越界");   System.out.println(" ...

  6. 浅谈java中异常抛出后代码是否会继续执行

    问题 今天遇到一个问题,在下面的代码中,当抛出运行时异常后,后面的代码还会执行吗,是否需要在异常后面加上return语句呢? public void add(int index, E element) ...

  7. 一个问题:关于finally中return吞掉catch块中抛出的异常

    今天遇到一个感觉很神奇的问题,记录一下问题以及自己分析问题的思路. 预警:不知道怎么看java字节码的朋友可能需要先看一下如何阅读java字节码才能看懂后面的解释. 我有一段程序: public cl ...

  8. [JavaScript]catch(ex)语句中的ex

    try/catch语句是JavaScript语句提供的异常处理机制,一旦try语句块内部的语句抛出异常,在catch语句块即可捕获到Error类型的异常信息.我们知道JavaScript里是没有块作用 ...

  9. Sql语法高级应用之六:如何在Sql语句中如何使用TRY...CATCH

    TRY...CATCH使用范例 BEGIN TRY //逻辑语句块 END TRYBEGIN CATCH //Catch异常处理块 SET @msg = ERROR_MESSAGE(); PRINT ...

随机推荐

  1. 47.__if_not_exists语句

    #include <iostream> using namespace std; template<class T> class myclass { public: T t; ...

  2. Mysql学习总结(15)——Mysql错误码大全

    B.1. 服务器错误代码和消息 服务器错误信息来自下述源文件: ·         错误消息信息列在share/errmsg.txt文件中."%d"和"%s"分 ...

  3. System.out.println 的多线程并发问题

    假设println函数的參数为常量则不会出现线程并发问题,可是假设參数为表达式形式.则JVM在运行println函数的时候会分为几步来运行,从而造成并发问题. 例如以下样例所看到的: package ...

  4. C/C++函数指针声明

    前天看APUE,看到signal的声明竟然是 void (*signal(int,void(*)(int)))(int); 初看下面,还真是看不出这是啥意思.道行太浅,仅仅能看到这样的函数指针 voi ...

  5. Eclipse如何从导入SVN上导入项目

    1.右键单击,选择 Import,进入导入项目窗口 2.点击选择从SVN检出项目,点击Next下一步 3.选择创建新的资源库位置,点击Next,如果项目之前已经导入过删除掉了,重新导入的时候,只需勾选 ...

  6. 各大免费邮箱邮件群发账户SMTP服务器配置及SMTP发送量限制情况

    网络产品推广和新闻消息推送时,经常用到的工具就是用客户邮箱发送邮件了,如果是要发送的邮件量非常大的话,一般的建议是搭建自己的邮局服务器,或者是花钱购买专业的邮件群发服务,免费邮箱的SMTP适合少量的邮 ...

  7. 洛谷——P1096 Hanoi双塔问题

    https://www.luogu.org/problem/show?pid=1096 题目描述 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个 ...

  8. JDBC 专题

    digest: getFetchSize()方法不是获得记录数,而是获得每次抓取的记录数,默认是0,也就是说不限制.可以用setFetchSize()来设置,而getFetchSize()是用来读出那 ...

  9. Ab工具基本使用

    Ab简介 ab是apache自带的压力测试工具,ab是apachebench命令的缩写. ab不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试. ab是一个ht ...

  10. thinkphp模拟请求和参数绑定

    thinkphp模拟请求和参数绑定 一.总结 1.网页传过来的参数是可以修改的:get或者post等方式 传过来的参数是可以修改的  dump($request->get(['id'=>2 ...