------ android培训、java培训、java基础学习技术总结、期待与您交流! ----------
异常:就是程序在运行时出现不正常情况
异常的由来:问题也就是现实生活中一个具体的事物,也可以通过java的类的形式进行描述,并封装成对象。
其实就是java对不正常情况进行描述后的对象体现;
对于问题的划分:两种:一种是严重的问题,一种是非严重的问题‘’
对于严重的,java通过Error类进行描述。
对于Error一般不编写针对性的代码对其进行处理
对于非严重的,java通过Excetion类进行描述。
对于Exception可以使用针对性处理方式进行处理。
无论Error或者Exception都具有共同的行为
Throwable是java语言中Error或者Exception的父类。
ArithmeticException
java用面向对象的思想,对一些常见的问题进行封装,把问题变成对象
2.异常的处理
java提供了特有的语句进行处理。
try{
需要检测的代码;
}
catch(类 变量){
异常处理
}
finally{
}
3.对捕获到的异常对象进行常见的方法操作。
对多异常的处理
1.声明异常时,建议声明更为具体的异常,这样可以处理的更具体。
2.对方声明几个异常,就对应有几个catch块。
如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。
建立在进行catch处理时,catch中一定要定义具体的处理方式。
不要简单的定义一句e.printStacktrace()
不要写简单的输出语句。
项目中会出现特有的问题,
而这些问题并未被java所描述并封装对象。
所以对于这些特有的问题可以按照java对问题封装的思想。
将特有的问题。进行自定义的异常封装。
自定义异常
需求:在本程序中,对于除数是-1,也视为是错误的是无法进行的运算的。
那么就需要对这个问题进行自定义的描述。
自定义的异常需要继承Exception
当在函数内部出现了throw抛出一场对象,那么就必须要给对应的处理动作。
要么的内部try catch处理,要么在函数上声明让调用者处理
一般情况在,函数内出现了异常,函数上需要声明。
发现打印的结果中只有异常的名称,却没有异常的信息。
因为自定义的异常并未定义所属信息。
如何自定义异常信息呢?
因为父类中已经把异常信息的操作都完成了。
所以子类只要在构造时,将异常信息传递给父类通过suer语句。
那么就可以直接通过getMessage方法获取自定义的异常信息。
必须是自定义类继承Exception
继承Exception原因
异常体系有一个特点,异常类和异常对象都被抛出。
他们都具有可抛性。这个可抛性是Throwable这个体系中独有特点
只有这个体系中的类和对象才可以被Throws和throw操作。
throws和throw的区别
throws使用在函数上,throw使用在函数内
throws后面跟的是异常类,可以跟多个,用逗号隔开。
throw后跟的是异常对象。
代码1示例如下:
此程序会报除零异常
class Demo{
int div(int x,int y){
return x/y;
}
}
public class ExceptionDemo {
public static void main(String[] args) {
Demo d=new Demo();
int x=d.div(4,0);
System.out.println("x="+x);
System.out.println("over");
}
}
代码示例2如下:
class Demo2
{
int div(int a,int b)throws Exception{//在功能上通过throws的关键字声明有可能出现问题。
return a/b;
}
}
public class ExceptionDemo2 {
public static void main(String[] args) {
Demo d = new Demo();
try {
int x = d.div(4, 0);
System.out.println("x+" + x);
} catch (Exception e) {
System.out.println("除零了!");
System.out.println(e.getMessage());
System.out.println(e.toString());
e.printStackTrace(); // jvm默认的异常处理机制,打印异常的堆栈信息
}
System.out.println("over");
}
}
代码示例3如下:
class Demo3
{
int div(int a,int b)throws Exception
{
return a/b;
}
}
public class ExceptionDemo3 {
public static void main(String[] args) throws Exception {
Demo3 d = new Demo3();
int x = d.div(4, 0);
System.out.println("x+" + x);
System.out.println("over");
}
}
代码示例4如下:
class Demo4{
int div(int a,int b)throws ArithmeticException,ArrayIndexOutOfBoundsException{
int arr[]=new int[a];
System.out.println(arr[4]);
return a/b;
}
}
public class ExceptionDemo4 {
public static void main(String[] args) {
Demo4 d=new Demo4();
try{
int x=d.div(4, 0);
System.out.println("x+"+x);
}catch(ArithmeticException e){
System.out.println(e.toString());
System.out.println("被除零啦!");
}catch(ArrayIndexOutOfBoundsException e){
System.out.println(e.toString());
System.out.println("角标越界啦!");
}/*catch(Exception e){
System.out.println("hhhaa:"+e.toString());
}*/
System.out.println("over");
}
}
代码示例5如下:
class FuShuException extends Exception{
private String msg;
private int value;
FuShuException(String msg,int value){
super(msg);
this.value=value;
}
public int getValue(){
return value;
}
/*public String toString(){
return msg;
}*/
}
class Demo5{
int div(int a,int b)throws FuShuException {
if(b<0)
throw new FuShuException("除数为负数!",b);
return a/b;
}
}
public class ExceptionDemo5 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Demo5 d=new Demo5();
try{
int x=d.div(4, -1);
System.out.println("x+"+x);
}catch(FuShuException e){
System.out.println(e.toString());
System.out.println("除数出现负数啦!"+e.getValue());
}
}
}