Java异常处理机制 try-catch-finally

Java拥有着强大的异常处理机制,最近初步学习了下,感觉内容还是挺多的,特此来将自己的理解写出来与大家分享。


一、在Java代码code中,由于使用Myeclipse IDE,可以自动提醒用户哪里有错,并且提供修改方法。很多情况下,当我们调用某个方法时,会提示我们某条语句应该用 try-catch语句来包起来。 但是一直没有去理解这是为什么!!! 举例说明如下:


ExceptionDemo.java

package com.package2;

class Demo
{
	int div(int a,int b)throws Exception//在功能上通过throws的关键字声明了该功能有可能会出现问题。
	{
		return a/b;
	}
}

public class  ExceptionDemo
{
	public static void main(String[] args)
	{
		Demo d = new Demo();
		try
		{
			int x = d.div(4,0);
			System.out.println("x="+x);
		}
		catch (Exception e)//Exception e = new ArithmeticException();
		{
			System.out.println("除零啦");
			System.out.println(e.getMessage());//  / by zero;
			System.out.println(e.toString());// 异常名称 : 异常信息。

			e.printStackTrace();//异常名称,异常信息,异常出现的位置。
							//其实jvm默认的异常处理机制,就是在调用printStackTrace方法。
							//打印异常的堆栈的跟踪信息。

		}		

		System.out.println("over");

	}
}

为什么会出现提示呢?原因就在于被调用的方法throws了异常,即声明本函数可能会出现异常。

int div(int a,int b) throws Exception//在功能上通过throws的关键字声明了该功能有可能会出现问题。
    {
        return a/b;
    }

此处抛出了异常,即任何调用此函数的地方都得准备随时捕获并且处理异常。

二、异常:就是程序在运行时出现不正常情况。


异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述。并封装成对象。
                   其实就是java对不正常情况进行描述后的对象体现。

对于问题的划分:两种:一种是严重的问题,一种非严重的问题。

对于严重的,java通过Error类进行描述。
                        对于Error一般不编写针对性的代码对其进行处理。

对与非严重的,java通过Exception类进行描述。
                           对于Exception可以使用针对性的处理方式进行处理。

无论Error或者Exception都具有一些共性内容。
比如:不正常情况的信息,引发原因等。

Throwable
    |--Error
    |--Exception
  

任何一个异常或者错误都继承于Throwable类,在Error和Exception下边分别各有N多种子类。

异常的处理:

(1)、java 提供了特有的语句进行处理。
try
{
    需要被检测的代码;
}
catch(异常类 变量)
{
    处理异常的代码;(处理方式)
}
finally
{
    一定会执行的语句;
}

其中,当try中的语句产生异常时,会抛出一个异常对象,并且赋值给语句catch(异常类 变量)中的此变量。

由于出现异常被捕获之后,程序将不再执行出现异常下边的代码,而直接跳转到try-catch-finally语句块的下边开始执行。所以,在finall{ }语句块中执行的代码一般为释放程序资源,如关闭打开的文件等。

其中,try-catch-finally块中,finally块在以下几种情况将不会执行。

(1)finally块中发生了异常。

(2)程序所在线程死亡。

(3)在前面的代码中用了System.exit();    (ps这条是经常出现的)

(4)关闭了CPU

(2)、其中catch语句用于捕获并且处理异常,常见的处理机制有:getMessage()   toString()  以及printStackTrace()方法

举例如下:

上边代码,运行后如下:

由于进行了异常处理,所以程序执行完毕,“over”被打印出来。如果不加异常处理,JVM会报错,程序会停止执行。由上图可以看出默认的异常处理机制是调用e.printStackTrace()方法,并且终止程序的执行。

三、对多异常的处理。

(1)、声明异常时,建议声明更为具体的异常。这样处理的可以更具体。
(2)、对方声明几个异常,就对应有几个catch块。不要定义多余的catch块。
    如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。

举例如下:

package com.package2;

class Demo
{
	int div(int a,int b)throws ArithmeticException,ArrayIndexOutOfBoundsException//在功能上通过throws的关键字声明了该功能有可能会出现问题。
	{

		int[] arr = new int[a];

		System.out.println(arr[4]);

		return a/b;
	}
}

class  ExceptionDemo
{
	public static void main(String[] args)
	{
		Demo d = new Demo();
		try
		{
			int x = d.div(4,0);
			System.out.println("x="+x);
		}
		catch (ArithmeticException e)
		{
			System.out.println(e.toString());
			System.out.println("被零除了!!");

		}
		catch (ArrayIndexOutOfBoundsException e)
		{
			System.out.println(e.toString());
			System.out.println("角标越界啦!!");
		}
		catch(Exception e)
		{
			System.out.println("hahah:"+e.toString());
		}

		System.out.println("over");

	}
}

当传入a=4,b=1时,运行结果如下所示:

当传入a=5,b=0时,运行结果如下所示:

四、自定义异常:


因为项目中会出现特有的问题,而这些问题并未被java所描述并封装对象。所以对于这些特有的问题可以按照java的对问题封装的思想。将特有的问题。进行自定义的异常装。

举例说明如下:
需求:在本程序中,对于除数是-1,也视为是错误的是无法进行运算的
。那么就需要对这个问题进行自定义的描述。

当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作。要么在内部try catch处理。要么在函数上声明让调用者处理。

一般情况在,函数内出现异常,函数上需要声明,此时会发现打印的结果中只有异常的名称,却没有异常的信息。因为自定义的异常并未定义信息。

如何定义异常信息呢?
因为父类中已经把异常信息的操作都完成了。所以子类只要在构造时,将异常信息传递给父类通过super语句。那么就可以直接通过getMessage方法获取自定义的异常信息。

重点!!!自定义异常,必须是自定义类继承Exception。

继承Exception原因:异常体系有一个特点:因为异常类和异常对象都被抛出。他们都具备可抛性。这个可抛性是Throwable这个体系中独有特点。

代码如下:

package com.package2;

//自定义异常类
class FuShuException extends Exception //getMessage();
{
	private int value;

	//为空的构造方法
	FuShuException()
	{
		super();
	}
	//构造方法
	FuShuException(String msg,int value)
	{
		super(msg);
		this.value = value;
	}

	//自定义异常类的成员方法,用来定义异常信息。
	public int getValue()
	{
		return value;
	}

}

class Demo
{
	int div(int a,int b)throws FuShuException
	{
		//增加判断条件
		if(b<0)
			throw new FuShuException("出现了除数是负数的情况------ / by fushu",b);//手动通过throw关键字抛出一个自定义异常对象。

		return a/b;
	}
}

class  ExceptionDemo
{
	public static void main(String[] args)
	{
		Demo d = new Demo();
		try
		{
			int x = d.div(4,-9);
			System.out.println("x="+x);
		}
		catch (FuShuException e)
		{
			System.out.println(e.toString());
			System.out.println("除数出现负数了");
			System.out.println("错误的负数是:"+e.getValue());
		}

		System.out.println("over");

	}
}

运行结果如图所示:

五、throws和throw的区别:
throws使用在函数上。  throw使用在函数内。
throws后面跟的异常类,可以跟多个,用逗号隔开。  throw后跟的是异常对象。

六、运行时异常与编译时异常的区别:

答:运行时异常:只需要在方法内部抛出异常即可。调用该方法的地方不做任何处理。即程序就是计划让出现运行时异常的程序停止运行。

编译时异常:定义该方法时,需要在方法体上对异常进行抛出。在调用该方法的位置处,必须进行相应的异常处理,即选择捕获或者进行抛出(throws)。即,程序可以继续执行下去。

时间: 2024-10-01 04:13:39

Java异常处理机制 try-catch-finally的相关文章

Java异常处理机制:try...catch...的执行流程

Java异常处理机制:try...catch...的执行流程 在项目中遇到try...catch...语句,因为对Java异常处理机制的流程不是很清楚,导致对相关逻辑代码不理解.所以现在来总结Java异常处理机制的处理流程: 1.异常处理的机制如下: 在方法中用 try... catch... 语句捕获并处理异常,catch 语句可以有多个,用来匹配多个不同类型的异常. 对于处理不了的异常或者要转型的异常,在方法的声明处通过 throws 声明异常,通过throw语句拋出异常,即由上层的调用方法

Java异常处理机制的秘密

一.结论 这些结论你可能从未听说过,但其正确性是毋庸置疑的,不妨先看看: 1.catch中throw不一定能抛回到上一层,因为finally中的return会抑制这个throw2.finally中throw一定能抛回上一层,因为此时其后的return不会被执行到(throw中断了正常的顺序流)3.在try/catch中return并不会直接返回上一层,而是先执行finally再返回 二.一段小程序 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

Java异常处理机制 —— 深入理解与开发应用

本文为原创博文,严禁转载,侵权必究! Java异常处理机制在日常开发中应用频繁,其最主要的不外乎几个关键字:try.catch.finally.throw.throws,以及各种各样的Exception.本篇文章主要在基础的使用方法上,进一步分析在开发中如何使用异常机制更合理. try-catch-finally try-catch-finally块的用法比较简单,使用频次也最高.try块中包含可能出现异常的语句(当然这是人为决定的,try理论上可以包含任何代码),catch块负责捕获可能出现的

Java 异常处理机制和集合框架

课程  Java面向对象程序设计   实验名称  异常处理机制.集合框架 班级    13级计三          学号  10503                姓名 一.实验目的 掌握面向对象程序设计技术 二.实验环境 1.微型计算机一台 2.WINDOWS操作系统,Java SDK,Eclipse开发环境 三.实验内容 1.Java异常处理机制涉及5个关键字:try.catch.finally.throw.throws,请理解每个关键字的作用,并在编写程序,使用运用这5个关键字,观察效果

Java异常处理机制很有意思

前言:在网络上看到一篇<深入理解Java异常处理机制>,看完感觉自己也有一点小想法,的确在很多Java学者的眼里,异常处理机制不就是try catch finally吗,有啥好理解,很多时候,我也经常忽略这方面的内容,感觉没什么有意思的,那么我们来扎个小马步吧 1.经过对原作者的例子改造 package mwq; public class T1 { public static void main(String[] args) { boolean b = true; try { b = tb1(

【转】深入理解java异常处理机制

深入理解java异常处理机制 1. 引子 try-catch-finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的"教训"告诉我,这个东西可不是想象中的那么简单.听话.不信?那你看看下面的代码,"猜猜"它执行后的结果会是什么?不要往后看答案.也不许执行代码看真正答案哦.如果你的答案是正确,那么这篇文章你就不用浪费时间看啦. <span style="background-color: rg

如何正确使用Java异常处理机制

第一节 异常处理概述 第二节 Java异常处理类 2.1 Throwable 2.1.1 Throwable有五种构造方法 2.1.2 Throwable的所有成员方法 2.2 Error 2.3 Exception 2.4 RuntimeException 2.5 Checked Exception 2.6 Uncheck Exception 2.7 总结 第三节 Java异常处理执行流程探究 3.1 流程一 3.2 流程二 3.3 流程三 3.4 流程四 3.5 流程五 3.6 流程六 3.

java异常处理机制详解

java异常处理机制详解 程序很难做到完美,不免有各种各样的异常.比如程序本身有bug,比如程序打印时打印机没有纸了,比如内存不足.为了解决这些异常,我们需要知道异常发生的原因.对于一些常见的异常,我们还可以提供一定的应对预案.C语言中的异常处理是简单的通过函数返回值来实现的,但返回值代表的含义往往是由惯例决定的.程序员需要查询大量的资料,才可能找到一个模糊的原因.面向对象语言,比如C++, Java, Python往往有更加复杂的异常处理机制.这里讨论Java中的异常处理机制. 异常处理 Ja

Java异常处理机制就是程序代码执行过程

我也是通过各种方式在进行验证是否可以满足我们的需求,今天我就发现了一个问题.现在我们来一起说明一下,这个可能不算是bug,而应该需要我们记住就可以了. 对于一副灰度图像I,她的每一个像素点I(x,y)都有一个灰度值,一般情况下可能的灰度取值有2^8=256个(0,1,...,255).如果我们统计出灰度值r在I中出现的次数n,并对其进行归一化(n/N,N是所有灰度值出现次数的总和),这样我们就可以得到像素r在I中出现的概率p(r).如果对每一个可能的灰度取值r都做同样的处理,我们可以得到如图1左

深入理解Java异常处理机制

1. 引子 try-catch-finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的"教训"告诉我,这个东西可不是想象中的那么简单.听话.不信?那你看看下面的代码,"猜猜"它执行后的结果会是什么?不要往后看答案.也不许执行代码看真正答案哦.如果你的答案是正确,那么这篇文章你就不用浪费时间看啦. <span style="background-color: rgb(255, 255, 255