首页 > 代码库 > 12-21java面向对象之异常

12-21java面向对象之异常

1.异常

异常是导致程序中断执行的一种指令流。

public class TestException1 
{
	public static void main(String[] args) 
	{
		int i = 10;			//定义整型变量
		int j =0 ;			//定义整型变量
		int temp = i/j ;
		System.out.println("两个数字相除的结果:" + temp);
	}
}

程序在执行之后出现异常提示:

F:\Reliability\java\work\Exception>java TestException1

Exception in thread "main" java.lang.ArithmeticException: / by zero

        at TestException1.main(TestException1.java:7)

public class TestException1 
{
	public static void main(String[] args) 
	{
		System.out.println("***********程序开始**************");
		int i = 10;			//定义整型变量
		int j =0 ;			//定义整型变量
		int temp = i/j ;     //此处产生了异常
		System.out.println("两个数字相除的结果:" + temp);
		System.out.println("***********程序结束**************");
	}
}

执行的结果发现,开始执行了但是结束并没有执行。一旦产生异常之后,异常之后的程序不再执行而是直接结束程序,并把错误报告给用户。

F:\Reliability\java\work\Exception>java TestException1

***********程序开始**************

Exception in thread "main" java.lang.ArithmeticException: / by zero

        at TestException1.main(TestException1.java:8)

计算机的两大杀手:

1.断电

2.被除数为0——>内存不足,全部占满

1.1异常的处理

要处理异常,必须使用异常处理格式:

Try——>catch——>finally  

技术分享

对之前的异常进行捕获

public class TestException2 
{
	public static void main(String[] args) 
	{
		System.out.println("***********程序开始**************");
		int i = 10;			//定义整型变量
		int j =0 ;			//定义整型变量
		try
		{
			int temp = i/j ;
			System.out.println("两个数字相除的结果:" + temp);
			System.out.println("_____________________");     //两条语句没有执行
		}
		catch (ArithmeticException e)		//算数异常
		{
			System.out.println("出现异常:" + e);
		}
		System.out.println("***********程序结束**************");
	}
}

执行结果:

技术分享

对于异常,可以设置统一出口finally完成。

public class TestException3 
{
	public static void main(String[] args) 
	{
		System.out.println("***********程序开始**************");
		int i = 10;			//定义整型变量
		int j =0 ;			//定义整型变量
		try
		{
			int temp = i/j ;
			System.out.println("两个数字相除的结果:" + temp);
			System.out.println("_____________________");
		}
		catch (ArithmeticException e)		//算数异常
		{
			System.out.println("出现异常:" + e);
		}
		Finally   //异常的统一出口
		{
			System.out.println("***********程序结束**************");
		}		
	}
}

以上的程序只是在代码中处理了一个异常,如果有多个异常?

通过初始化参数输入ij的数值

public class TestException4 
{
	public static void main(String[] args) 
	{
		System.out.println("***********程序开始**************");
		try
		{
			int i = Integer.parseInt(args[0]) ;	//初始化参数
			int j = Integer.parseInt(args[1]) ; 
			int temp = i/j ;
			System.out.println("两个数字相除的结果:" + temp);
			System.out.println("_____________________");
		}
		catch (ArithmeticException e)		//算数异常
		{
			System.out.println("出现异常:" + e);
		}
		finally
		{
			System.out.println("***********程序结束**************");
		}		
	}
}

对于不同的输入,得到不同的结果。

技术分享

对于以上的问题,进行修改catch代码

public class TestException4 
{
	public static void main(String[] args) 
	{
		System.out.println("***********程序开始**************");
		try
		{
			int i = Integer.parseInt(args[0]) ;	//初始化参数
			int j = Integer.parseInt(args[1]) ; 
			int temp = i/j ;
			System.out.println("两个数字相除的结果:" + temp);
			System.out.println("_____________________");
		}
		catch (ArithmeticException e)		//算数异常
		{
			System.out.println("出现异常:" + e);
		}
		catch(ArrayIndexOutOfBoundsException e)    //数组越界异常
		{
			System.out.println("出现异常:" + e);
		}
		catch (NumberFormatException e)     //数字转换格式异常
		{
			System.out.println("出现异常:" + e);
		}
		finally
		{
			System.out.println("***********程序结束**************");
		}		
	}
}

以上程序需要处理三个异常,这样一来程序异常处理十分麻烦,所以深入了解异常类的继承结构。

1.2异常类的继承结果

之前出现的三个异常:ArithmeticException   

ArrayIndexOutOfBoundsException 

NumberFormatException

Jav.lang->class 中的exception中异常处理有个类。

java的异常处理中有两个最常用的类——exception error

其中 exception 表示的是程序中出现的问题,try-catch进行处理

Eoor 指的是JVM中的错误,程序无法处理

注意:在输出异常信息的时候,可以直接使用System.out.println()进行输出,也可以使用Exception类中的方法public void printStackTrace(),专门打印异常信息。

1.3java异常处理机制

在整个java中,对于异常的处理是安装面向对象的方式进行的

1、一旦产生异常,首先会产生一个异常类的实例化对象

2、用try语句进行捕获

3、产生的异常对象与catch各个异常类型进行匹配

 

之前讲解过对象的多态性,子类的实例化可以用父类的对象进行接收,那么异常处理中,实际上也是使用这个概念,因为try产生实例化对象,都可以进行向上转型工作。

如果有某些异常不确定,最后使用exception进行捕获。此时的exception放到最后。

public class TestException5
{
	public static void main(String[] args) 
	{
		System.out.println("***********程序开始**************");
		try
		{
			int i = Integer.parseInt(args[0]) ;	//初始化参数
			int j = Integer.parseInt(args[1]) ; 
			int temp = i/j ;
			System.out.println("两个数字相除的结果:" + temp);
			System.out.println("_____________________");
		}
		catch (Exception e)
		{
			System.out.println("最粗的异常捕获" + e);
		}
		catch (ArithmeticException e)		//算数异常
		{
			//System.out.println("出现异常:" + e);
			e.printStackTrace();
		}
		catch(ArrayIndexOutOfBoundsException e)
		{
			System.out.println("出现异常:" + e);
		}
		catch (NumberFormatException e)
		{
			System.out.println("出现异常:" + e);
		}
		finally
		{
			System.out.println("***********程序结束**************");
		}		
	}
}
错误提示

TestException5.java:18: 错误已捕获到异常错误ArithmeticException

                catch (ArithmeticException e)          

                ^

TestException5.java:23: 错误已捕获到异常错误ArrayIndexOutOfBoundsException

                catch(ArrayIndexOutOfBoundsException e)

                ^

TestException5.java:27: 错误已捕获到异常错误NumberFormatException

                catch (NumberFormatException e)

                ^

程序顺序执行,先捕获到粗的,细的就不用在执行。

既然所有的Exception对象都可以向上转型,那么直接使用Exception进行捕获是不是更加方便

public class TestException6
{
	public static void main(String[] args) 
	{
		System.out.println("***********程序开始**************");
		try
		{
			int i = Integer.parseInt(args[0]) ;	//初始化参数
			int j = Integer.parseInt(args[1]) ; 
			int temp = i/j ;
			System.out.println("两个数字相除的结果:" + temp);
			System.out.println("_____________________");
		}
		catch (Exception e)
		{
			System.out.println("最粗的异常捕获" + e);
		}		
		finally
		{
			System.out.println("***********程序结束**************");
		}		
	}
}

当所有的异常的处理的方式是一样的可以使用以上的形式,在比较细致的开发中不建议这样使用。

既然捕获exception方便,那么直接捕获throwable是不是更好?

首先throwableexception的父类,理论是没有问题。但是程序try中只会抛出exception的对象,但是error没有。所以不使用这种方法。

1.4总结

1.异常出现会使程序停止

2.使用try-catch-finally

3.可以同时出现多个catch  捕获粗的放在最后,否则程序编译出现问题

4.最大的类是throwable分为两个子类









12-21java面向对象之异常