------- android培训、java培训、期待与您交流! ----------
一 异常
1 异常:程序运行时的不正常,java将这些异常封装成了对象
(1)作用:将问题进行封装,将正常流程代码和问题处理代码相分离
(2)异常分为两大体系,Error和Exception,其父类是Throwable。
其中,Error是严重的异常,一般不编写针对的处理代码。Exception是非严重的异常,可编写针对性的代码进行处理。
(3)父类Throwable类中定义的是所有异常的共性方法。
方法摘要:
getMessage() 获取异常信息
toString() 获取异常类名和异常信息
printStackTrace()获取异常类名和异常信息,以及异常出现在程序中的位置
2 异常的处理
(1)java虚拟机本身有异常处理机制,如果程序发生异常,java虚拟机会抛出异常信息并使程序停止
(2)java提供的处理异常语句
try
{
需要被检查的代码;
}
catch(异常类 变量)
{
处理异常的代码;
}
finally
{
一定会执行的语句;//一般用于关闭资源
}
(3)还有两种格式
try{} catch(){}
try{} finally{}
3 throws和throw
(1)throws关键字用于在方法上标明该方法可能会发生某类异常
(2)声明异常时,建议声明更为具体的异常,这样处理的更为具体
(3)如果调用者调用了在方法上标明throws的方法,调用者必须处理该异常或者在自己所在的函数上声明异常
(4)throw关键字用于在方法内手动抛出异常对象
(5)throw和throws的区别:
throws定义在函数上,后面跟异常类,可以多个,用于声明该函数可能发生某类异常。
throw定义在函数内,后面跟异常对象,用于抛出异常对象。
4 多异常处理
(1)如果方法上声明了多个异常,那么调用者应该定义多个对应的catch块
(2)如果多个catch块存在继承关系,那么父类的catch块放在最下面
下面通过一个例子说明:
class Demo
{
public static void main(String[] args)
{
ExceptionDemo ed=new ExceptionDemo();
try
{
//该方法上throws了异常,调用该方法需要处理或在主函数上声明,这里用的是try处理
ed.show(1);
}
catch (ArrayIndexOutOfBoundsException e)
{
//如果真的发生ArrayIndexOutOfBoundsException异常,会执行该语句.不发生异常该语句不会执行
System.out.println("角标越界啦");
}
catch (ArithmeticException e)
{
//如果真的发生ArithmeticException异常,会执行该语句.不发生异常该语句不会执行
System.out.println("除以0啦");
}
catch (Exception e)
{
//因为Exception是他们的父类都能接受,所以应该放在最下面。
//但是不建议用,因为这样的话很容易将问题隐藏掉
System.out.println("除以0啦");
}
finally
{
System.out.println("over");//不管有没有异常发生都会执行
}
}
}
class ExceptionDemo
{
//在方法上声明可能会发生数组角标越界异常和算数运算异常
public void show(int x) throws ArrayIndexOutOfBoundsException,ArithmeticException
{
int[] arr=new int[4];
System.out.println(arr[3]);
int y=10/x;
System.out.println(y);
}
}
5 自定义异常
(1)在我们做项目时,当我们所描述的问题java没有进行封装时,我们可以将自己的问题进行封装对象。
(2)自定义异常时,应该继承Exception或RuntimeException,让其类继承java异常体系,具备可抛性以及使用体系的共性方法。
(3)如果方法中出现通过throw抛出的异常时,一般情况下,应当在函数上声明异常(RuntimeException及其子类除外)
6 RuntimeException类
(1)RuntimeException是Exception的一个特殊子类,是运行时异常
(2)当函数抛出RuntimeException以及其子类时,函数上可以不用声明,调用者也可以不用处理
(3)该异常发生是因为乱传数据而导致的,所以必须让程序停下来由程序员修改代码
举例说明:
//定义一个长方形类
class ChangFangXing
{
private double len;
private double wid;
//初始化长和宽
ChangFangXing(double len,double wid)
{
//判断长和宽,如果小于0就抛出异常程序结束
if(len<=0||wid<=0)
throw new NoFuShuException("长或宽不大于0,不是个长方形,无法求面积");
else
{
this.len=len;
this.wid=wid;
}
}
//返回面积
public double area()
{
return len*wid;
}
}
//自定义一个异常类继承RuntimeException成为运行时异常
//让程序一发生异常就程序停止
class NoFuShuException extends RuntimeException
{
NoFuShuException(String msg)
{
super(msg);
}
}
class RuntimeExceptionDemo
{
public static void main(String[] args) //主函数
{
//创建长方形对象,在这里不try处理
//因为如果程序发生异常是因为调用者误传参数导致的,所以需要让程序停止,有程序员修改
ChangFangXing cfx=new ChangFangXing(3.0,-4.0);
//程序如果发生异常,下面语句不执行
double a=cfx.area();
System.out.println(a);
}
}
7 对于异常,分两种
(1)编译时被检测的异常,
(2)编译时不被检查的异常,运行时异常,也就是RuntimeException及其子类
8 finally代码块
(1)finally代码块里面定义的是一定会执行的语句。包括前面读到return语句。
(2)finally有一种情况不会被执行到,就是读到System.exit(0);
(2)通常用于关闭资源
9 异常在子父类覆盖的体现
(1)子类覆盖父类方法时,父类方法抛出异常,那么子类只能抛出该异常或该异常的子类
(2)子类覆盖父类方法时,父类抛出多个异常,子类只能抛出多个异常的子集
(3)子类覆盖父类方法时,父类没有抛出异常,子类也不能抛出异常,如果子类方法发生异常,只能内部处理
总结就是:父类没有异常,之类不能有异常。父类就算有,子类不能比他多,子类有只能是父类异常本身或该异常的子类
二 包(package)
1 概述:对类进行分类管理,为类提供多层命名空间,包也是封装的一种形式。必须写在程序的第一行
2 作用:可以以将源文件与class文件分离,提供安全性。
3 package和import关键字
package用来标识class文件所属的包,后面加包名,一般包名全部小写,必须放在程序的第一行。如:package pack;
import用于导入某个包里的类文件,后面可以加包名.class文件名(代表导入具体的某个类),也可以加包名.*(代表导入某个包的全部类文件)
4 一个包中的类要被访问,要有足够大的权限,所以被访问的类要被public修饰,以及成员也要被public修饰。
(1)protected(保护权限):不同包中的子类可以直接访问父类中被protected修饰的成员。
(2)包与包之间可以使用的权限只有两种,public和protected