JAVA自学教程之(java程序的异常处理 (二))



JAVA自学教程之(java程序的异常处理 (二))。

异常处理的捕捉形式:

这是可以对异常进行针对性处理的方式

 

六、try、catch的理解

 

具体格式:

 

  1. try
  2. {
  3. //需要被检测异常的代码
  4. }
  5. catch(异常类 变量)//改变量用于接受发生异常的对象
  6. {
  7. //处理异常的代码
  8. }
  9. finally
  10. {
  11. //一定会被执行的代码
  12. }
try
{
//需要被检测异常的代码
}
catch(异常类 变量)//改变量用于接受发生异常的对象
{
//处理异常的代码
}
finally
{
//一定会被执行的代码
}

 

这三个代码块是一个整体。

try是尝试,catch捕捉,finally最终化

 

什么时候用try&catch,什么时候用抛?

在定义功能时,如果这个问题你可以处理的了,那么就用try&&catch,处理不了那么就用抛

代码演示:

 

  1. import java.util.*;
  2. class FuException extends Exception
  3. {
  4.     FuException()
  5.     {
  6.     }
  7.     FuException(String s)
  8.     {
  9.         super(s);//Exception有
  10.         //System.out.println(s);
  11.     }
  12. }
  13. class ExceptionDemo
  14. {//要么捕捉,要么抛出
  15.     public int method(int[] arr,int index) throws FuException
  16.     {
  17.             if(index<0)
  18.             {
  19.             throw new FuException(“The index is fushu”);
  20.             }
  21.         return arr[index];
  22.     }
  23. }
  24. public class Main
  25. {
  26.     public static void main(String[] args)//throws FuException
  27.     {
  28.         int[] a = new int[10];
  29.         ExceptionDemo C = new ExceptionDemo();
  30.         try
  31.         {
  32.             int num = C.method(a,-2);
  33.             System.out.print(“num”+num);
  34.         }
  35.         catch (FuException e)
  36.         {
  37.             System.out.println(“角标为负数啦!”);
  38.         //e对象可用可不用,下面是一些常用的方法
  39.             System.out.println(“Message:”+e.getMessage());
  40.         System.out.println(“string:”+e.toString());//toString可省略
  41.         //打印异常信息
  42.         e.printStackTrace();//jvm默认的异常处理机制就是调用异常对象的这个方法
  43.         }
  44.     }
  45. }
import java.util.*;
class FuException extends Exception
{
	FuException()
	{
	}
	FuException(String s)
	{
		super(s);//Exception有
		//System.out.println(s);
	}
}
class ExceptionDemo 
{//要么捕捉,要么抛出
	public int method(int[] arr,int index) throws FuException
	{
			if(index<0)
			{
			throw new FuException("The index is fushu");
		    }
		return arr[index];
	}
}
public class Main
{
	public static void main(String[] args)//throws FuException
	{
		int[] a = new int[10];
		ExceptionDemo C = new ExceptionDemo();
		try 
		{
			int num = C.method(a,-2);
			System.out.print("num"+num);
		} 
		catch (FuException e) 
		{
			System.out.println("角标为负数啦!");
		//e对象可用可不用,下面是一些常用的方法
			System.out.println("Message:"+e.getMessage());
		System.out.println("string:"+e.toString());//toString可省略
		//打印异常信息
		e.printStackTrace();//jvm默认的异常处理机制就是调用异常对象的这个方法

		}
	}	
}

 

/*真正建立日志文件

*log four(java; ; )

*{

*

*}

*/其简写形式:log4j

 

七、多catch情况

如果在程序处理时,抛出了多个异常


 

  1. import java.util.*;
  2. class FuException extends Exception
  3. {
  4.     FuException()
  5.     {
  6.     }
  7.     FuException(String s)
  8.     {
  9.         super(s);//Exception有
  10.         //System.out.println(s);
  11.     }
  12. }
  13. class ExceptionDemo
  14. {
  15.     public int method(int[] arr,int index) throws FuException,NullPointerException
  16.     {
  17.             if(index<0)
  18.             {
  19.             throw new FuException(“The index is fushu”);
  20.             }
  21.             if (arr==null)
  22.             {
  23.                 throw new NullPointerException(“没有数组实体”);//可自定义
  24.             }
  25.         return arr[index];
  26.     }
  27. }
  28. public class Main
  29. {
  30.     public static void main(String[] args)//throws FuException
  31.     {
  32.         int[] a = new int[10];
  33.         ExceptionDemo C = new ExceptionDemo();
  34.         try
  35.         {
  36.             int num = C.method(a,2);
  37.             System.out.print(“num”+num);
  38.         }
  39.         catch (FuException e)
  40.         {
  41.             System.out.println(“角标为负数啦!”);
  42.         }
  43.         catch (NullPointerException e)
  44.         {
  45.             //e.printStackTrace();
  46.             System.out.println(“Message:”+e.getMessage());
  47.         }
  48.         //多catch情况,如果有以下catch情况,不能房最上面,会接受所有对象
  49.         catch (Exception e)
  50.         {
  51.             //父类的catch房最下面,否则编译失败
  52.             //如果实在出现已有catch以外的情况,虚拟机会处理
  53.         }
  54.     }
  55. }
import java.util.*;
class FuException extends Exception
{
	FuException()
	{
	}
	FuException(String s)
	{
		super(s);//Exception有
		//System.out.println(s);
	}
}
class ExceptionDemo 
{
	public int method(int[] arr,int index) throws FuException,NullPointerException
	{
			if(index<0)
			{
			throw new FuException("The index is fushu");
		    }
			if (arr==null)
			{
				throw new NullPointerException("没有数组实体");//可自定义
			}
		return arr[index];
	}
}
public class Main
{
	public static void main(String[] args)//throws FuException
	{
		int[] a = new int[10];
		ExceptionDemo C = new ExceptionDemo();
		try 
		{
			int num = C.method(a,2);
			System.out.print("num"+num);
		}
		catch (FuException e) 
		{
			System.out.println("角标为负数啦!");	
		}
		catch (NullPointerException e) 
		{
			//e.printStackTrace();
			System.out.println("Message:"+e.getMessage());
		} 
		//多catch情况,如果有以下catch情况,不能房最上面,会接受所有对象
		catch (Exception e) 
		{
			//父类的catch房最下面,否则编译失败
			//如果实在出现已有catch以外的情况,虚拟机会处理
		}
	}	
}

 

 

八、异常的处理原则

 

try到底什么时候用?

最根本的核心:只要使用了声明异常的方法,就要try,只要代码中有抛出异常的动作,如果能处理就用try,见到了异常就处理,没有异常就不需要处理。注意:没有错误,非要写try,不仅没意义,还存在弊端,如果真的要处理异常,但是不知道是什么异常,那么只能写Exception,一旦未知异常真的发生了,但是却有个预先处理的方式 ,处理什么不知道,这个异常被处理掉了,一旦处理掉了,就相当于异常被隐藏,但是程序还在正常执行。所以,只要没说有问题,就不处理,只要问题发生了,看到了,再考虑问题是否要处理

异常处理的原则:

1.函数内部如果抛出需要检测的异常,函数上必须要声明,否则必须在函数内部用try&&catch捕捉,否则编译失败

2.如果调用到了声明异常的函数,要么try&&catch,要么throws,否则编译失败

3.什么时候catch,什么时候throws?

功能内部可以解决,用catch

解决不了,用throws,由调用者解决

4.一个功能如果抛出了多个异常,那么调用时必须对应多个catch,进行针对性的处理

(内部有几个需要检测的异常,就要抛几个异常,抛几个,就catch几个)

 

九、finally代码块

 

/*finally的应用: * 用到finally最多的地方,比如数据库 * 例如:打开百度,搜索 * 连接数据库 * 查询:假如Exception了,查询过程中出问题 * 关闭连接 *如果出现异常,不关闭连接,还在浪费数据库资源,所以无论是否出现异常,关闭连接一定要执行 *进而释放资源,故关闭连接定义在finally里 */

所以:凡是有资源需要关闭,一定要定义在finally里。

 

try,catch,finally代码块组合的方式:

1、try,catch,finally(三个都有常见)

2、try、catch,没有必要资源需要释放时,就没必要定义finally

3、try、finally  异常无法直接catch处理,但是资源一定要关闭

 

  1. void show()//throws Exception,不用声明,因为catch已经处理了
  2. {
  3.     try
  4.     {   throw new Exception();  }
  5.     //有catch
  6.     catch
  7.     {   …..  }
  8. }
void show()//throws Exception,不用声明,因为catch已经处理了
{
	try 
	{	throw new Exception();  }
	//有catch
	catch
	{	.....  }
}
  1. void show()throws Exception//没catch,就要声明
  2. try
  3. {   throw new Exception();  }
  4. //没catch
  5. finally  //连接资源,出现异常,但是这个异常不一定就要处理,但是资源一定要关闭,因为在内部开辟的,别人不知道
  6. {  ….   }