JAVA异常
异常:
是在运行时期发生的不正常情况
在java中用类的形式对不正常情况进行了描述和封装对象。描述不正常情况的类,就称为异常类。
其实异常类就是java通过面向对象的思想将问题封装成了对象,用异常类对其进行描述
Throwsble(具有可抛性):无论是error还是异常,问题发生就可以抛出,让调用者知道并处理
关键字thorws throw表示具备可抛性
异常分类:
1、编译时异常:只要是Exception和其子类都是,除了特殊子类RuntimeException。 从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。
2、运行时异常:就是Exception中的RuntimeException及其子类。 这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是 由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
自定义异常时,要么继承Exception要么继承RuntimeException。
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>=arr.length)
{
throw new ArrayIndexOutOfBoundsException("数组的角标越界啦,哥们,你是不是疯了?:"+index);
}
if(index<0)
{
throw new FuShuIndexException("角标变成负数啦!!");
}
return arr[index];
}
}
thorws throw的区别:
1、throws用在函数上,throw用在函数内
2、throws抛出的时异常类,可以抛出多个,用逗号隔开。throw抛出的是异常对象
异常处理的捕捉形式:try{} catch(异常类变量) finally
try:需要被检测异常的代码
catch:处理异常的代码
finally: 一定会被执行的代码
多catch把父Exception放在最下面,否则编译失败
e.printStackTrace:JVM默认的异常处理机制就是调用异常对象的这个方法。将此Throeable及其追踪输出到指定的输出流
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("负数角标异常!!!!");
}
/*
catch(Exception e)//多catch父类的catch放在最下面。
{
}
*/
System.out.println("over");
}
}
异常处理原则:
1、函数内部如果抛出需要检测的异常,那么函数上必须声明。否则必须在函数内用try catch捕捉,否则编译失败
2、如果调用到了声明异常的函数,要么try catch要么throws
3、功能内容可以解决,用catch,解决不了,用thorws告诉调用者,由调用者解决。
4、一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性处理。
异常注意事项:
1、子类覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或异常的子类。
2、如果父类抛出了多个异常,子类只能抛出父类异常的子集。
interface Inter
{
void function();
}
class D implements Inter
{
public void function()//throws Exception
{}
}
class A extends Exception
{
}
class B extends A
{
}
class C extends Exception
{
}
Exception
|--A
|--B
|--C
class Fu
{
void show()throws A
{}
}
class Test
{
void method(Fu f)//Fu f = new Zi();
{
try
{
f.show();
}
catch (A a)
{
}
}
}
class Zi extends Fu
{
void show()throws C
{
}
}