Java笔记之异常详解

版权声明:关注微信公众号:摸鱼科技资讯,联系我们 https://blog.csdn.net/qq_36949176/article/details/82962125

异常:是在运行时期发生的不正常情况

 在Java中用类的形式对不正常情况进行了描述和封装对象

描述不正常情况的类,就称为异常类

以前正常流程代码和问题处理代码相结合

现在将正常流程代码和问题处理代码分离,提高阅读性。

其实异常就是java通过面向对象的思想将问题封装成了对象

用异常类对其进行描述。

不同的问题用不同的类进行具体的描述。比如角标越界、空指针等等。

问题很多,意味着描述的类也很多,

将其共性进行向上抽取,形成了异常体系。

最终问题(不正常情况)就分成了两大类。

Throwable(具有可抛的特性):无论是error ,还是异常,问题,问题发生就应该可以抛出,让调用者知道并处理。

//该体系的特点就在于Throwable及其所有的子类都具有可抛性。

可抛性导致指的是什么呢?怎么体现可抛性呢?

其实是通过两个关键字来体现的。

thows thow ,凡是可以被这两个关键字所操作的类和对象都具备可抛性。

1、一般不可处理的。Error 

特点:是由jvm抛出的严重性的问题。

这种问题发生一般不针对性处理。直接修改程序。

2、可处理的。Exception

特点:子类的后缀名都是用其父类名作为后缀,阅读性很强。

参考jdk api 在线帮助文档:http://tool.oschina.net/apidocs/apidoc?api=jdk_7u4

自定义异常

thow 函数里面

class Demo
{
    public int method(int[] arr,int index)
    {
        if(index>=arr.length)
        {
         throw new ArrayIndexOutOfBoundsException("数组的角标越界啦,哥们"+index);
            }
        return arr[index];
      }
}

class ExcetionDemo2
{
        public static void main(String[] args)
        {
            int[] arr =new int[3];
            Demo d =new Demo();
            int num =d.method(arr,30);
            System.out.println("num="+num);
            System.out.println("over");
          }
}

如上面的代码,抛出异常类,并带参数:数组的角标越界啦,哥们 30

有些问题系统没有定义,需要自己定义。所以这种自定义的问题描述成自定义异常。

注意:如果让一个类称为异常类,必须要继承异常体系,因为只有称为异常体系的子类才有资格具备可抛性

才可以被两个关键字所操作。throws  thow

class FuShuIndex extends Exception
{
    FushuIndexException()
    {}
    FushuIndexException(String msg)
    {
    super(msg);
    }        //构造函数
}

thows 函数声明上

class Demo
{
    public int method(int[] arr,int index)throws FuShuIndexException
    {
        if(index<0)
        {
            throw new FuShuIndexException("角标变成负数啦!");
        }
    
    }
}
//如果你函数内发生了异常,你需要在函数上声明,否则失败

class ExceptionDemo3
{
    public static void main(String[] args) throws FuShuIndexException
    {
        int[] arr=new int[3];
        Demo d=new Demo();
        int num=d.method(arr,-30);
        System.out.println("GG");
        
    }

}
//你调用了发生异常的函数,你必须要处理,不处理一样失败,处理的方式就是抛出

异常的分类:

1、编译时被检测异常:只要是Exception和其子类都是,除了特殊子类RuntimeException体系。

            这种问题一旦出现,希望在编译时就进行检测,让这种问题有对应的处理方式。

           这样的问题都可以进行针对性的处理。

2、编译时不检测异常(运行时异常):就是Exception中的RuntimeException和其子类。

       这种问题的发生,无法让功能继续,运算无法进行,更多是因为调用的原因导致的。

       而或者引发了内部状态的改变导致的,那么这种问题一般不处理,直接编译通过,

       在运行时,让调用者调用时的程序强制停止,让调用者对代码进行修正。

   

所以自定义异常时,要么继承Exception。要么继承RuntimeException。


throws 和throw的区别

1、throws使用在函数上
    throw使用在函数内
2、throws抛出的是异常类,可以抛出多个,用逗号隔开
     throw抛出的是异常对象

异常处理的捕捉形式:
这是可以对异常进行针对性处理的方式。

具体格式是:

try
{
    //需要被检测异常的代码。
}
catch(异常类 变量)//该变量用于接收发生的异常对象
{
    //处理异常的代码。
}
finally
{
    //一定会被执行的代码。
}

异常处理的原则:
1、函数内容如果抛出需要检测的异常,那么函数上必须要声明。
    否则必须在函数内用trycatch捕捉,否则编译失败。  
2、如果调用到了声明异常的函数,要么trycatch要么throws,否则编译失败。

3、什么时候catch,什么时候throws 呢?
    功能内容可以解决,用catch。
    解决不了,用throws告诉调用者,由调用者解决 。

4、一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性的处理。
    内部又几个需要检测的异常,就抛几个异常,抛出几个,就catch几个。
 


class FuShuIndexException extends Exception
{
	FuShuIndexException()
	{}

	
	FuShuIndexException(String msg)
	{
		super(msg);
	}
}


class Demo
{
	public int method(int[] arr,int index)//throws NullPointerException,FuShuIndexException
	{	
		if(arr==null)
			throw new NullPointerException("没有任何数组实体");
		if(index<0)
			throw new FuShuIndexException();
			
		return arr[index];
	}
}

class  ExceptionDemo4
{
	public static void main(String[] args) 
	{
		int[] arr = new int[3];		
		Demo d = new Demo();
		try
		{
			int num = d.method(null,-1);
			System.out.println("num="+num);
			
		}
		
		catch(NullPointerException e)
		{
			System.out.println(e.toString());
		}
		catch (FuShuIndexException e)
		{
			System.out.println("message:"+e.getMessage());
			System.out.println("string:"+e.toString());

			e.printStackTrace();//jvm默认的异常处理机制就是调用异常对象的这个方法。

			System.out.println("负数角标异常!!!!");
           // return -1; 写了这句话,就执行不了System.out.println("over");直接返回,不写还会执行最后一句
		}
		/*
		catch(Exception e)//多catch父类的catch放在最下面。
		{
			
		}
          finally //通常用于关闭(释放)资源
        {
            }
		*/
		System.out.println("over");
	}
	
}

常用于数据库

/*

class NoAddException extends Exception
{}

void addData(Data d)throws NoAddException
{

	连接数据库
	try
	{
	添加数据。出现异常 SQLException();
	}
	catch(SQLException e)
	{
		//处理代码。

		throw new NoAddException();
	}
	fianlly
	{
	关闭数据库。
	}
}

异常的注意事项:

1、子类在覆盖父类方法时,父类的方法如果抛出了异常,
那么子类的方法只能抛出父类的异常或者该异常的子类。

2、如果父类抛出多个异常,那么子类只能抛出父类异常的子集。

简单说:子类覆盖父类只能抛出父类的异常或者子类或者子集。 

注意:如果父类的方法没有抛出异常,那么子类覆盖时绝对不能抛,就只能try .

猜你喜欢

转载自blog.csdn.net/qq_36949176/article/details/82962125