java基础_06_异常

异常

异常就是在程序执行过程中出现错误时,阻止其继续执行。出现了异常从某种意义上来说就是出现了问题,它可能会导致程序失败。发生异常后,异常以后的代码将不再执行。

 

异常的分类

Throwable 类是Java语言中所有错误或异常的超类,它有两个子类:Error 、 Exception.

1Error  

      是系统不可恢复的错误,JVM 发生的错误。这种问题大到我们无法处理。

       如:OutOfMemoryError 堆内存溢出

              StackOverflowError 栈内存溢出

              VirtualMachineError 虚拟机崩溃或所操作的资源用尽

2Exception 

      程序可以检查处理的异常。又可分为下面两种。

      一:CheckedException :需要用try...catch...捕获

      二:UncheckedException :不需要捕获,又叫做RuntimeException.

      注意:  RuntimeException异常。

      1,在函数里内容上抛出 throw  RuntimeException异常,函数上可以不用声明,编译一样通过。

      2,如果在函数上声明了该异常,调用者可以不用进行处理。编译一样通过。之所以不用在函数声明,是因    为不需要让调用者处理。(如果声明调用者必须处理,处理后程序继续运行)

      3,当该异常发生,希望程序停止。因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码     进行修正。

      4,自定义异常时:如果该异常的发生,无法在继续进行运算,就让自定义异常继承 RuntimeException  

      常见的RuntimeException有:

       IllegalArgumentException :异常表明向方法传递了一个不合法或不正确的参数。

       IllegalStateException : 在非法或不适当的时间调用方法时产生的信号。

       NullPointerException : 当应用程序试图在需要对象的地方使用 null 时,抛出该异常。

       IndexOutOfBoundsException :数组角标越界。

 

处理异常的方式?

1,使用try  catch  finally  捕获。把可能出现异常的代码入 try{  代码  中。

      注意:finally代码块:一定会执行,一般用于关闭资源。

      有一个特殊情况下finally不会执行,它前面有 System.exit(0); 退出语句时 不会执行。

2,直接再抛出异常。这种方式就是让其调用者自己去处理。

      注意:如果程序中出现了异常,要么在内部try catch 处理,要么在函数上声明让调用者处理。

    
   例:
    class Demo
    {
    	int div(int a,int b) throws Exception	//抛出异常,让调用者去处理可能出现的问题。
        					//调用者必须处理,否者编译失败
    						//也可以抛出多异常 throws ActivationException, AWTException,等等									// 用逗号隔开。抛出几个异常,调用者就得处理几个
    	{
    		return a/b;  //分母可能传0进来
    	}
    }
    class  ExceptionDemo
    {
    	public static void main(String[] args) 
    	{
    		Demo d=new Demo();
    		try
    		{
    			int x=d.div(4,1);	//如果出错这里面后面的语句不在执行
    			System.out.println(x); 
    		}
    		catch (Exception e)	//异常处理
    		{
    			System.out.println("出问题了。。。");
    		}
    		/*
    		//有几个处理几个
    		catch (ActivationException e)
    		{
    		
    		}
    		catch (AWTException e)
    		{
    		
    		}
    		*/
    		finally`//一定会执行的代码,可以不写这个
    		{
    			System.out.println("finally");
    		}
    
    		System.out.println("over");
    	}
    }

 

throwthrows区别?

1throws  抛出异常(用在函数上)

     throw   抛出自定义的那种异常(用在函数内)

2throws  后面跟异常类,可以跟多个,用逗号隔开

      throw   后跟的是异常对象

 

自定义异常

程序中一般有自己对异常的要求,所以在程序中大多是自定义异常来处理异常的。

 

自定义异常步骤:

1,自已定义异常类,并继承 Exception ,如果无法在继续进行运算,就继承 RuntimeException 

      例:

             class FuShuException  extends Exception //自定义异常

             {  }

2,在发生异常的地方抛出自己定义的异常。

      格式 : throw 自定义异常类

       例:

            在方法div 上抛出自己定义的异常类。

            int div(int a,int b) throws FuShuException //抛出自定义的异常

            {  }

        例:

    用上面的,假定除数不能是负数,自定义抛出异常。

class FuShuException  extends Exception	//自定义异常
{
	private int a;
	FuShuException(String msg)	
	{
		super(msg);	//父类已做好了。。继承就可以了
		
	//	父类做了这些 Exception 是继承超类 Throwable 的
	//	class Throwable //处理异常类超类,直接子类 Exception,Error
	//	{
	//		private String message;
	//		Throwable(String message)
	//		{
	//			this.message=message;
	//		}
	//		public String getMessage()
	//		{
	//			return message;
	//		}
	//	}
	}
	//加入自己的数据例子
	FuShuException(String msg,int a)	
	{
		super(msg);
		this.a=a;
	}

}
class Demo
{

	int div(int a,int b) throws FuShuException	//抛出自定义的异常
	{
		if(b<0)
			throw new FuShuException("分母出现负数了。。。");  //抛出一个自定义异常对象				                                   		                     return a/b;  //分母可能传0进来

		//if(b==0)
		//	throw new ArithmeticException("除0了。。");  //这样写上面方法那里可以不用声明(因为是RuntimeException子类),如果发生这个异常,程序停止。
	}
}
class  ExceptionDemo
{
	public static void main(String[] args) 
	{
		Demo d=new Demo();
		try
		{
			int x=d.div(4,1);	//如果出错这里面后面的语句不在执行
			System.out.println(x); 
		}
		catch (FuShuException e)	//异常处理
		{
			System.out.println("除负数了。。。");
		}
		System.out.println("over");
	}
}

心得:  

  有了异常的处理机制,很好的解决了程序中可能出现的问题,避免程序错误的执行。有了问题就反映给程序员。异常可抛可处理,如果抛出去,则其调用着必须处理或可接着抛。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值