您的位置:首页 > 编程语言 > Java开发

java异常

2014-03-13 13:06 134 查看
------ android培训java培训,期待与您交流
------

黑马程序员 java之异常

异常:就是不正常,程序在运行时出现的不正常情况,其实就是程序中出现的问题。出现的问题有很多种,比如角标越界,空指针异常等都是而且这些问题都有共性内容。

异常的体系:
java.lang.Throwable:

Throwable:可抛出的。
|--Error:错误,一般情况下,不编写针对性的代码进行处理,通常是jvm发生的,需要对程序进行修正。
|--Exception:异常,可以有针对性的处理方式。
    |--RuntimeException:运行时异常,编译时不检测。
Throwable 类是 Java 语言中所有错误或异常的超类。
只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。
这个体系中的所有类和对象都具备一个独有的特点;就是可抛性。

API中提供的throwable的相关方法:
String getMessage()  返回此 throwable 的详细消息字符串。 
void printStackTrace()   将此 throwable 及其追踪输出至标准错误流。
void printStackTrace(PrintStream s)  将此 throwable 及其追踪输出到指定的输出流。  

throwable下的两个子类,我们重要关注点是Exception

对于异常的处理方式有两种:1、捕捉 2、抛出。
对于捕捉:java有针对性的语句块进行处理。
try {
需要被检测的代码;
    }
catch(异常类 变量名){
异常处理代码;
}
fianlly{
一定会执行的代码;
}

在除法运算中,分母不能为零,这时若调用者传入了分母为零的参数,需要进行异常的处理:
package exception;
public class ExceptionDemo {
public static void main(String[] args) {
Math m = new Math();
try {
//将可能出现异常的代码放入try中
int result = m.div(6, 0);
System.out.println(result);
} catch (Exception e) {
//捕捉异常信息
System.out.println("分母不能为零");
}
}
}
class Math {
public int div(int x, int y) {
return x / y;
}
}

上面调用div()方法时,出现的异常是我们自己处理的,在开发中,我们自定义的功能可能也会发生异常,

调用者可处理可不处理,这时若希望调用者处理,我们可以用在函数上用throws关键字进行声明。
class Math {
public int div(int x, int y) throws Exception {//在方法上声明了该功能可能会出现异常
return x / y;
}
}

异常处理原则:功能抛出几个异常,功能调用如果进行try处理,需要与之对应的catch处理代码块,
    这样的处理有针对性,抛几个就处理几个。

自定义异常:当开发时,项目中出现了java中没有定义过的问题时,这时就需要我们按照java异常建立思想,

将项目的中的特有问题也进行对象的封装,这个异常,称为自定义异常。
例如在一个项目中,对于负数作为分母也是不可以的,
但负数的部分java并没有针对描述,这时我们就可以自定义这个异常

自定义异常的步骤:
1:定义一个子类继承Exception或RuntimeException,让该类具备可抛性。
2:通过throw 或者throws进行操作。
package exception;
public class ExceptionDemo {
public static void main(String[] args) {
Math m = new Math();
try {
// 将可能出现异常的代码放入try中
int result = m.div(6, -3);
System.out.println(result);
} catch (Exception e) {
// 捕捉异常信息
System.out.println(e.getMessage());
}
}
}
class Math {
public int div(int x, int y) throws FushuException {
if(y<0){
//自定义异常信息并抛出
throw new FushuException("除数不能为负数");
}
return x / y;
}
}
//自定义异常需继承Exception,使之具有可抛性
class FushuException extends Exception {
private String msg;
FushuException(String msg) {
super(msg);
}
}

异常的好处:
用面向对象的思想,将问题进行封装。
将正常流程代码与问题处理代码分离,便于阅读。

异常中throw 和throws关键字的区别:
throw用于抛出异常对象,后面跟的是异常对象。
throws用于抛出异常类,后面跟的异常类名,可以跟多个,throws用在函数上。

通常情况:函数内抛出异常对象,并没有进行处理,那么函数上一定要声明,否则编译失败。
但是也有特殊情况,这就涉及到了异常的分类。

异常分两种:
1:编译时被检查的异常,只要是Exception及其子类都是编译时被检测的异常。
2:运行时异常,RuntimeException以及RuntimeException的子类都是运行异常。

编译时被检查的异常和运行时异常的区别:
编译被检查的异常在函数内被抛出,函数必须要声明,否编译失败。
声明的原因:是需要调用者对该异常进行处理。

运行时异常如果在函数内被抛出,在函数上不需要声明。
不声明的原因:不需要调用者处理,运行时异常发生,已经无法再让程序继续运行,
直接让程序停止,由调用者对代码进行修正。

异常在子父类进行覆盖时的特点:
1:当子类覆盖父类的方法时,如果父类的方法抛出了异常。
  那么子类的方法要么不抛出异常要么抛出父类异常或者该异常的子类,不能抛出其他异常。
2:如果父类抛出了多个异常,那么子类在覆盖时只能抛出父类的异常的子集。
  也就是说,子类抛出的异常不能比父类多。
3.如果父类或者接口中的方法没有抛出过异常,子类不仅不能抛出异常的。
  而且子类的覆盖的方法中有异常只能try不能throws。
------ android培训java培训,期待与您交流
------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息