1)编译时被检测异常
该异常在编译时,如果没有处理(没有抛也没有try),编译失败。该异常被标识,代表着可以被处理。
2)运行时异常(编译时不检测)
在编译时,不需要处理,编译器不检查。该异常的发生,建议不处理,让程序停止。需要对代码进行修正。如:RuntimeException以及其子类。
对于严重的问题,java通过Error类进行描述。对Error类一般不编写针对性的代码对其进行处理。
对于非严重的,java通过Exception类进行描述。对于Exception可以使用针对性的处理方式进行处理。
Throwable
|---Error //通常出现重大问题如:运行的类不存在或者内存溢出等。
|---Exception //运行时出现的一起情况
|---RuntimeException //特殊异常类,抛时不需要声明
4、异常的处理
class FushuIndexException extends Exception{
FushuIndexException(String name) {
super(name);
}
}
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];
}
}
public class ExceptionDemo {
public static void main(String[] args){
int[] arr=new int[3];
Demo d=new Demo();
try {
int num=d.method(arr, -3);
System.out.print(num);
}
catch(FushuIndexException e){
System.out.print("角标数字不能为负");
}
}
以上程序中,用到了throws,try {}catch(){},那么这些什么时候用,是否还有别的机制?我们需要掌握好。
异常处理原则:
1)函数内容如果抛出需要检测的异常,那么函数上必须要声明,否则必须在函数内用trycatch捕捉,否则编译失败
2) 如果调用了声明异常的函数,要么try catch要么throws,否则编译失败
3) (什么时候catch,什么时候throws呢? )功能内容可以自己解决,用catch,解决不了,就throws告诉调用者解决
4)如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性的处理,内部有几个需要检测的异常,就抛几个异常,抛出几个,就catch几个
java提供了特有的语句进行处理。
try
{需要被检测的代码。}
catch(异常类 变量)
{处理异常的代码;(处理方式) }
finally
{一定会执行的语句; }
有三个结合格式:
a、try
{}
finally
{}
b、try
{}
catch ()
{}
c、try
{ }
catch ()
{}
finally
{}
throw和throws的用法
throw定义在函数内,用于抛出异常对象。
throws定义在函数上,用于抛出异常类,可以抛出多个用逗号隔开。
当函数内容有throw抛出异常对象,并未进行try处理。必须要在函数上声明,否则编译失败。
注意:RuntimeException除外。也就说,函数内如果抛出的RuntimeExcpetion异常,函数上可以不用声明。
特殊之处:
Exception中有一个特殊的子类异常RuntimeException 运行时异常。
1) 如果在函数内抛出该异常,函数上可以不用声明,编译一样通过。
2)如果在函数上声明了该异常。调用者可以不用进行处理。编译一样通过。
之所以不用在函数上声明,是因为不需要让调用者处理。当该异常发生,希望程序停止。因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。
5、自定义异常( 如以上程序中的FushuIndexException类就是自定义异常)因为项目中会出现特有的问题,而这些问题并未被java所描述并封装对象。所以对这些特有的问题可以按照java中的面向对象思想。将特有的问题,进行自定义的异常封装。定义类继承Exception或者RuntimeException
自定义异常注意事项:
必须是自定义类有继承关系,通常继承Exception。
继承Exception原因:
异常体系有一个特点:因为异常类和异常对象都被抛出。他们都具备可抛性。这个可抛性是Throwable这个体系中独有特点。
只有这个体系中的类和对象才可以被throws和throw操作。
在java中,管叫包,相当于文件夹。包里通常存放的是类文件。
2、包的好处
1)为避免多个类重名的情况,如果出现两个相同名字的类,可通过包将两者区分,从而避免冲突。
2)对类文件进行分类管理,可以将相关的一些类放在同一个包中。
3)给类提供多层命名空间,如a包中的Demo.class文件,如果要创建Demo对象,就要在使用时加上a.如:a.Demo demo=new a.Demo();
4)包的出现可以将java的类文件和源文件相分离。
3、包的规则
1)包必须写在程序的第一行。因为要先有包,才知道类文件的存放地方。
2)类的全称:包名.类名。
3)编译定义了包的程序文件时,在编译时要指定包的存储目录。
4、包的使用(导入-import)
a,在导入包时,如果包中有很多类,可以使用通配符 *来替代包中的所有类。但是,建议不要使用通配符 * ,因为将不需要使用的类导入后,会占用内存空间。所有在编写程序时,要使用包中的哪些类,就导入哪些类。
b,定义包名不要重复,可以使用url来完成定义,url是唯一的。如:package cn.itheima.Demo。
c,导入的不同包中有相同类时,必须写类的全名以区分,否则将会报错。