Java异常处理


我们写程序的时候,经常会遇到各种错误的发生,汇总起来大概有两种;

·语法错误——拼写错误

·逻辑错误——数组下标越界、除数为0.

语法错误可以有编译器调试的出,所以容易解决;但是逻辑错误就不能这么轻松的得出问题所在,所以我们对这类错误要进行管理。

为了解决这类问题,一般有两种办法:

·使用if语句,把各种问题导致的故障考虑在里面。但是使用if语句要把所有的情况都考虑在内,思维繁琐困难,而且这种情况下异常情况的处理与原程序混杂在一起,干扰了人们实现程序的功能。

·异常处理类和异常处理机制。这种情况下我们可以把关注点集中到程序功能上面去,异常处理单独提出来,在另外的地方实现。

异常处理就是将接受和处理错误的代码分开。程序员可以着眼于功能的实现而 不用纠结于异常的处理。这样就增强了程序的可读性,有利于程序的阅读和理解。

计算机对异常的处理通常有两种情况:

(1)计算机自动检测及处理异常。

(2)人工加入异常处理程序。

Java语言采用面向对象的异常处理机制。通过异常处理机制,可以预防错误所造成的影响,并能够及时处理。Java系统的异常处理机制主要包括两个步骤:

(1)捕获异常

(2)处理异常

对于可能的出现的错误情况,Java使用“异常处理机制”来预防、捕获并处理这些异常。

1.异常类

Java中所有的异常情况都被定义为某一类的异常对象。

Java中所有的异常类都是Throwable类的子类或者子类派生而来,Throwable类定义在java.lang包中,。这就说明他们具有某些相同的属性和方法,在使用上也有一定的相似性。

Throwable类有两个重要的子类:Exception类和Error类。Exception类是所有异常类的直接父类,Error类是所有错误类型类的直接父类。

2.异常处理

Java语言的异常处理主要有:

(1)try-catch-finally语句.

(2)throw语句.

(3)throws语句.

2.1try-catch-finally

语法规则如下:

try
{
	//可能出现异常的代码
}
catch(异常类型1  异常名1)
{
	//处理异常的程序代码
}
catch(异常类型2  异常名2)
{
	//处理异常的程序代码
}
······
finally
{
	//前面无法处理的异常,在这里解决
}
将源程序代码放在try块中,运行时监控检查try块中的程序代码,如果有异常出现,将会抛出一个或者多个异常。所以在try后面可跟一个或者多个catch。如果有多个catch块,一般异常处理放那额日较小的在前面,异常包含范围较大的在后面。

如果try块中没有出现异常,那么所有与当前try块相关的catch块都会被忽略,程序继续执行try-cathc结构后面的语句。

如果try块中出现了异常,异常出现语句后面的语句将被忽略,程序转向cathc异常处理结构中,有catch捕获并处理 异常。

如果catch块后面有finally块,则不管有没有异常发生、catch块是否执行都会执行finally块。finally块可选,一般用来进行程序管理,如一些释放资源、关闭文件等操作。

示例:

public class Example04 {

	/**
	 * 异常处理
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a=1,b=0;
		try
		{
			System.out.println(a/b);  //可能出现异常的代码
		}
		catch(ArithmeticException e)  //异常类型  异常名
		{
			System.out.println("除数不能为0!");//处理异常的程序代码
		}
	}
}
2.2throws:在方法中声明抛出异常

throws使用在方法头部,声明该方法被调用的时候可能抛出某种异常,但这一种方法我们不知道该I如何处理,而是向后传递直到能够处理它的地方为止。有了throws抛出的异常,我们就可以关注于方法的功能实现,而异常的实现既可以单独编写,也可以交由系统处理。throws的处理方法是:

返回值  方法名()  throws 异常1,异常2······

示例:

public class Example04 {
	/**
	 * 异常处理
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try{
			out();
		}catch(ArithmeticException e)
		{
			System.out.println("除数不能是0!");
		}
	}
	public static void out() throws ArithmeticException
	{
		int i=5/0;
		System.out.println(i);
	}
}
示例:

利用输入输出类接受字符并输出,这其中涉及到输入输出异常IOException。

public class Example04 {
	/**
	 * 异常处理
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try{
			out();
		}catch(IOException e)
		{
			System.out.println(e.toString());
		}
	}
	public static void out() throws IOException
	{
		//int i=5/0;
		char c=(char)System.in.read();
		System.out.println(c);
	}
}
2.3throw:抛出异常

throw用于明确抛出异常对象。当程序执行到throw处时,程序返回调用者处处理异常。throw使用语法如下:

throw 异常对象

示例:

public class Example04 {

	/**
	 * 异常处理
	 * @param args
	 */
	static int k = 0;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try{
			out();
		}catch(ArithmeticException e)
		{
			System.out.println("除数不能是0!");
		}
	}
	public static void out() throws ArithmeticException
	{
		if(k==0)
			throw new ArithmeticException();
		int i=5/k;
		System.out.println(i);
	}
}
要注意throws和throw的差别:

·throws是声明可能抛出异常,而throw是一定抛出异常

·throws用于方法头部,而throw是用于方法体中

3.自定义异常

Java提供了相当多的异常处理类来处理各种异常。但实际运行中各种异常情况太多,很多异常情况并未有系统定义的异常类,所以我们必须解决这个问题。

Java中提供了这样的机制:Java允许程序员自己定义异常类以处理系统未定义的异常。创建异常类的形式如同穿件一般类。

示例:

public class Example05 {

	/**
	 * 自定义异常类
	 * @param args
	 */
	static int k =0;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try{
			if(k==0)                    //次此处说明何时抛出自定义异常
			{
				throw new MyException();
			}
			int i = 5/k;
		}catch(MyException e)           //捕获异常
		{
			System.out.println(e.toString());
		}
	}
}
class MyException extends Exception    //自定义异常
{
	public MyException(){              //自定义异常的构造方法
		super("除数不能是0!");
	}
	public MyException(String str){
		super(str);
	}
}
小结:

异常,是指发生可能导致系统无法运行或运行出现错误的情况,如文件无法打开、用户输入错误、除数为0、数组小标越界等。

异常处理是将接收和处理错误的代码分开。程序员可以着眼于程序功能的实现而不用纠结于异常的处理。这样就增强了程序的可读性,有利于程序的阅读和理解。

对于可能出现的异常,Java使用“异常处理机制”来预防、捕获并处理这些异常。

Java中所有的异常类都是Throwable类的子类。Throwable类有两个重要的子类:Exception类和Error类。Exception类是所有异常类的直接父类,Error类是所有错误类型类的直接父类。

Java中异常处理方式主要有:try-cathc-finally语句、throw语句、throws语句,他们分别可以实现对异常情况的处理。

Java允许程序自定义异常类以处理各种系统未定义的异常。程序员可以通过继承Exception或者其子类来创建自己的异常类。

你可能感兴趣的:(异常处理)