Java中的异常处理机制 - Angel's Blog.

ing
 
 
软件开发,程序设计,前端设计
 
 
首页 > code > Java中的异常处理机制

Java中的异常处理机制

 

1)Java中的程序异常:

下面看一个代码片段demo,这个代码的要求是:

输入一个数字,要求这个数字是从1到9之间的整数,如果不满足条件的操作数,则会print一条tip信息且要求重新输入:

demo:

 

public class DealEx
{
	public static void main(String[] args)
	{
		System.out.println("请输入1到9之间的整型数:");
		Scanner input = new Scanner(System.in);
		int num = input.nextInt();//从键盘读取要求输入的整数

		while(num <= 0 || num >= 10)//boolean
		{
			System.out.println("输入的数字不符合标准.." +
					"请核实后重新输入..");
			System.out.println("请输入1到9之间的整数:");
			num = input.nextInt();
			System.out.println("输入符合标准...");
		}
		System.out.println("如果有bug请及时feedback");
	}
}

好了,如果您在使用这个简单的console程序的时候,没有按照输入的要求,超过数字的限定范围,譬如输入了非int类型,这个时候,Java的console 会print异常的信息。

程序中的异常的发生是伴随着非正常的event,会将正在运行中的程序中断。

2)对程序的异常进行采取措施:

①:异常处理:

Java中,使用异常处理机制,为程序更好的提供了错误处理的能力。和c#中的try/catch/finally使用的方法大同小异。

try:如果某个代码片段可能会出现异常,将它放置到”try”语句块中。

catch:catch这个语句块类似于一个方法,参数类似于方法的声明,参数中包含了一个异常类型(是一种类型)和一个异常对象异常,其异常类型是java.lang.Exception或它的子类;在catch中主要做的工作就是捕获异常。

finally:finally中的使用和c#类似,通常是用在处理资源的释放等;譬如在c#中关闭数据库连接等操作,也就是说,无论是在Java还是c#中,finally这个语句块中的代码必须被执行。

throws:使用在定义的方法中,在方法的声明处,用来标记该方法可能抛出的异常。

throw:使用在定义的方法体中,用来抛出出现的异常。

②:try-catch:

在之前的demo代码片段中,我们可能不经意间没有按照要求输入了一个非整型,这个时候我们需要预先对可能出现错误的那段代码进行try-catch处理;

利用try-catch修改demo的代码(请看如下的demo1):

demo1:

 

package dealException;

import java.util.Scanner;

public class DealEx
{
	public static void main(String[] args)
	{
		System.out.println("请输入1到9之间的整型数:");
		Scanner input = new Scanner(System.in);
		try
		{
			int num = input.nextInt();//从键盘读取要求输入的整数

			while(num <= 0 || num >= 10)//boolean
			{
				System.out.println("输入的数字不符合标准.." +
						"请核实后重新输入..");
				System.out.println("请输入1到9之间的整数:");
				num = input.nextInt();
				System.out.println("输入符合标准...");
			}
		}
		catch (Exception e)
		{
			// TODO: handle exception
			System.out.println("注意:输入的数字非整型数!");
			e.printStackTrace();//调用参数对象的.printStackTrace()方法,打印堆栈中的异常
		}
		System.out.println("如果有bug请及时feedback");
	}
} 

在demo1中,try-catch执行的过程:

⑴:try中的代码语句正常执行完成,则catch中的代码语句就会被忽略,不会执行catch中的内容。

⑵:try中的代码语句执行出现了异常,且这个异常类型和catch中声明的异常类型匹配,try语句块中的剩余内容都不会被执行。

在这里,如果输入一个非整型数的内容,则在demo1中的try语句块处的code:int num = input.nextInt(); 会抛出一个InputMismatchException异常,InputMismatchException属于Exception子类,程序将进入catch中。

常见的异常类型:

 

异常 说明
Exception 异常类的根类
ArithmeticException 算是错误情形,譬如:零为除数
ArrayIndexOutOfBoundsException 数组小于或大于实际的数组大小
NullPoioterException 访问null对象成员
ClassNotFoundException 无法加载所需的类
InputMismatchException 期望得到的数据类型与实际的类型不一致
IllegalArgumentException 方法接收到了非法参数

⑶:try中的代码语句执行出现异常,但在catch中却没有声明对应的异常,在执行的过程中遇到了异常会直接退出,而不会执行catch和后面的代码。

③:try-catch-finally:

在demo1的基础上,附加finally块(目的是无论是否遇到了异常,都要执行finally块中的代码)。

demo2:

 

public class DealFinal
{
	public static void main(String[] args)
	{
		System.out.println("请输入1到9之间的整型数:");
		Scanner input = new Scanner(System.in);
		try
		{
			int num = input.nextInt();//从键盘读取要求输入的整数

			while(num <= 0 || num >= 10)//boolean
			{
				System.out.println("输入的数字不符合标准.." +
						"请核实后重新输入..");
				System.out.println("请输入1到9之间的整数:");
				num = input.nextInt();
				System.out.println("输入符合标准...");
			}
		}
		catch (Exception e) {
			// TODO: handle exception
			System.out.println("注意:输入的数字非整型数!");
			e.printStackTrace();//调用参数对象的.printStackTrace()方法,打印堆栈中的异常
		}
		finally
		{
			System.out.println("如果有bug请及时feedback");
		}

	}
}

在demo2中,try-catch-finally执行的过程:

⑴:try中的代码语句正常执行,catch会被忽略,最后执行finally块中的代码。

⑵:相反地,try中的代码语句执行过程出现异常,先进入catch,最后执行finally块中的代码。

④:多重catch块:

demo3:

 

public class DealMuliCatch
{
	public static void main(String[] args)
	{
		Scanner input = new Scanner(System.in);
		try
		{
			System.out.println("请输入第一个整数:");
			int num1 = input.nextInt();
			System.out.println("请输入第二个整数:");
			int num2 = input.nextInt();
			int totals = num1 / num2;
			System.out.println("两个数之商为:" + totals);
		}
		catch (InputMismatchException e1)
		{
			// TODO: handle exception
			System.out.println("注意!输入的第一个不是整数");
		}
		catch (ArithmeticException e2)
		{
			// TODO: handle exception
			System.out.println("注意,输入的第二个不能为零!");
		}
		catch (Exception e)
		{
			// TODO: handle exception
			System.out.println("错误!!" + e.getMessage());
			//获取异常的信息,.操作符调用getMessage()方法
		}
	}
}

 

在这里,运行的过程中,会对每一个遇到问题的catch语句块处理异常进行检查,并且只执行第一个遇到异常匹配类型的catch语句;被执行处理的catch语句后的其他catch语句都被被忽略。

在demo3中多重catch块执行的过程:

⑴:如果在给键盘读取的num1一个非int类型的输入,系统会抛出对应的InputMismatchException异常,InputMismatchException属于Exception子类,程序将进入catch中,对应的catch执行完,后面剩余catch被忽略;如果在给键盘读取的操作数num2一个数字“0”,系统会抛出对应的ArithmeticException类型的异常,除数不得为“0”,进入对应类型的catch,执行完成对应的catch,剩余的catch被忽略。

注意:使用多重catch的时候,一般都是从高优先级别的catch到最低级别的catch,最后的一般都是Exception类。

⑤:抛出异常:

相对于捕获异常,Java中的抛出异常使用throw关键字。

下面看一个简单的demo:

demo4:

 

public class ThrowDemo
{
	//围观抛出异常。
	public static void main(String[] args)
	{
		Scanner input = new Scanner(System.in);
		System.out.println("请输入三个数字:");
		int num1 = input.nextInt();
		int num2 = input.nextInt();
		int num3 = input.nextInt();
		int myList [] = {num1 , num2 , num3};
		if (myList.length != 3)//嘿嘿,纯粹测试下异常,其实这个条件永远不成立
		{
			System.out.println("输入的数字组成的数组长度为" + myList.length);
		}
		else
		{
			//抛出异常
			throw new ArrayIndexOutOfBoundsException();
		}
	}
}

⑥:声明异常:

在Java中,通过throws关键字声明具体某一个方法可能会出现的异常。

demo5:

 

//抛出&&声明异常
public class MyInfoEx
{
	private String sectionId;

	public String getSectionId() {
		return sectionId;
	}

	public void setSectionId(String sectionId) {
		this.sectionId = sectionId;
	}
	//通过throws关键字声明可能发生异常的方法
	public void setMyId(String sid) throws IllegalArgumentException
	{
		if (sid.length() == 5)
		{
			sectionId = sid;
		}
		else
		{
			throw new IllegalArgumentException("参数的长度应为5");
		}
	}
	//使用main方法,捕获异常
	public static void main(String[] args)
	{
		MyInfoEx mx = new MyInfoEx();
		try {
			mx.setMyId("TNT888");
		} catch (IllegalArgumentException e) {
			// TODO: handle exception
			System.out.println(e.getMessage());
		}
	}
}
或者通过RSS 关注本站的更新 ^ O ^ 。” —  by  转载请注明:来自 Angel's Blog.
本文永久链接: http://www.0ee.com/2010/12/22/java-programming-handling-exception.html
 
分类: code标签: , ,
 
  • QQ书签
  • Del.icio.us
  • 百度收藏
  • Google
  • 饭否
  • FriendFeed
 

 
评论 (10) Trackbacks (0)
发表评论 Trackback
 
10 Comments Contributed by Visitors
  1.     云在天边 2010年12月23日09:19 1#

    呵呵,你也ajax评论分页啦 ok

  2.     youngsunblog 2010年12月23日05:13 2#

    ok 围观

  3.     88250 2010年12月23日01:18 3#

    再加点 unchecked exception 介绍就好了 ok

  4.     Angel 2010年12月23日05:34 4#

    @88250
    okay,感谢前辈提醒,下一次更新日志会添加进来。 ok

  5.     Angel 2010年12月23日14:19 5#

    @云在天边
    嗯,是的,嘿嘿,感觉效果不错就换上了;不敢弄成完全无刷新,,你懂得,嘿嘿。。
    (Via wap blog)

  6.     学夫子 2010年12月23日15:43 6#

    好吧,我就是来围观围观,哈哈

  7.     Mucid 2010年12月22日14:41 7#

    js好像也是这德行……(PS:友链已加) ok
    这个模板的异常处理机制就很不错啦!

  8.     Angel 2010年12月23日05:32 8#

    @Mucid
    okay,已经看到了,嘿嘿 ok
    嘿嘿,还好吧,也是刚去具体学习异常处理机制。

  9.     Angel 2010年12月23日05:35 9#

    @youngsunblog
    嘿嘿,欢迎学习参考。 ok

  10.     Angel 2010年12月23日23:27 10#

    @学夫子
    嘿嘿,欢迎数学王子围观学习。
    (Via wap blog)

Leave Comments Here...

:) :-D :( :-o 8-O :-? 8) lol :-x :-P oops cry evil twisted wink ? idea :-| arrow mrgreen roll !

(required)

(required)

网址随您("http://"可以省略)

(Ctrl+Enter)

  • 本站不会泄露您的 Email 地址, 敬请放心.
  • 本站已开启缓存, 请不要重复提交评论.
  • 请注意: 带有 《广告(链)、不健康、或者 产品名字》 的评论一律视为spam.
  • 支持常用 HTML 标签调用, 插入 HTML 标签需注意: < == &lt;> == &gt;.
  • 仅当某人针对您的评论做出回应时, 您才会收到由本站发出的邮件通知.
  • 如您希望以相同方式通知某位网友, 请点击  按钮进行回复.
  • 允许在评论中使用如下代码: 
    <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> 
    <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> 
    .
  • 鼠标悬浮到评论中的 @someone 区域即可自动显示 someone 的评论内容.
 
 
  • 正在加载...