今天终于把困扰自己一段时间的java异常彻底解决了,心理感到一阵轻松!
java中的异常其实是各种继承了Exception的对象,错误发生后程序就此中断,转而去执行异常对象中的内容。
在java中异常被看做一个类来处理。下面是java中异常类的继承体系:
Throwable是所有异常和错误的超类,其有两个子类:Error,Exception-分别表示错误和异常。Error表示程序中出现的无法处理的错误,比如:outMemoryError,ThreadDeath等。这些异常一旦发生,程序(JVM)会选择线程终止。
Exception是程序本身可以处理的异常,这种异常又分为运行时异常和非运行时异常。这些异常不会影响程序的执行,只是改变改变程序的执行流程。如果程序中出现了 这种异常,那么系统就会转到专门处理此异常的代码片段(其中包含引起此异常的原因),这对于我们检测程序运行错误原因是很有帮助的。
运行时异常都是RuntimeException类及其子类异常,如NullPointException等,这些异常程序中可以选择捕获处理也可以不处理。异常一般是由于程序逻辑错误引起的,程序应该从逻辑角度应可能的避免这种异常的发生。
非运行异常是RuntimeExeption以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException,SQLException等以及用户自定义的异常(继承Exception类)
java异常中有几个很重要的关键字:try,catch,finally,throw,throws.
任何有可能抛出异常的程序片段都必须包含在try后面中的一对大括号中,同时大括号后面必须跟上catch{},里面包含所有异常的处理,因为抛出的异常可能会有不止一种所以后面的catch块相应也有多种。不过这些catch块的先后顺序有区别的。就是按继承关系放止的,子类异常要放在父类异常的前面。因为虚拟机在处理异常时,会优先处理子类异常,如果相对子类异常处理完后,后面的异常就不会再处理了。
下面举个例子说明一下:
package Exception;
class MyException extends Exception { //创建自定义异常类
String message; //定义String类型变量
public MyException(String ErrorMessagr) { //父类方法
message = ErrorMessagr;
}
public String getMessage(){ //覆盖getMessage()方法
return message;
}
}
package Exception;
public class ExceptionTest { //创建类
static int quotient(int x,int y)throws MyException{//定义方法抛出异常
if(x< 0){ //判断参数是否小于0
throw new MyException("除数不能是负数");//异常信息
}
return x/y;//返回值
}
public static void main(String args[]){ //主方法
try{
int result = quotient(-5,0);
}//调用方法quotient()
catch (MyException e) { //处理自定义异常
System.out.println(e.getMessage()); //输出异常信息
}
catch (ArithmeticException e) {
//处理ArithmeticException异常
System.out.println("除数不能为0");//输出提示信息
}
catch (Exception e) { //处理其他异常
System.out.println("程序发生了其他的异常");
//输出提示信息
}
}
}
throw后面跟上一个异常类,通常表示的是手动抛出用户自定义的异常,因为程序中的一些错误可能并不是语法错误而只是实际问题相关的逻辑错误。例如定义一个表示年龄的变量Int age=-34;显然对于虚拟机来说它并不是错误(语法错误),但在实际问题中年龄不可能也不应该是负值。如果用户输入了负值的话系统并不会抛出任何异常,程序正常运行但结果可定是错误的。这就需要在出现这种情况的时候,我们自己抛出一个异常类,让程序去处理这种错误。
throws虽然仅仅比throw多一个s,但用途完全不一样。
throws放置在一个方法名后,表示这个方法中的程序可能会抛出的异常类型(可能为用户自定义的异常也可能是系统异常)。如果是用户自定义的类型还要在引起此异常的程序语句后加上一句:throw 异常类(表示手动抛出异常)。现在这个方法只是抛出了异常,还没有考虑处理异常(当然可以加上try与catch完成异常的处理),但是有时方法并不能处理其本身抛出的异常,那么它可以把那些异常交给调用它的方法进行处理,这种现象称为回避异常。这就好比老板给员工分配任务,而员工在执行任务时遇到了问题,但是这些问题自己没有能力或是权利解觉,于是把问题交给了老板,让老板自己解决,当然老板也可以把其交给老板的老板。。。。如此循环的话就构成了异常嵌套处理。把所有异常都统一交给某个方法来进行集中处理,这样处理的效率会更高。
java中的异常其实是各种继承了Exception的对象,错误发生后程序就此中断,转而去执行异常对象中的内容。
在java中异常被看做一个类来处理。下面是java中异常类的继承体系:
Throwable是所有异常和错误的超类,其有两个子类:Error,Exception-分别表示错误和异常。Error表示程序中出现的无法处理的错误,比如:outMemoryError,ThreadDeath等。这些异常一旦发生,程序(JVM)会选择线程终止。
Exception是程序本身可以处理的异常,这种异常又分为运行时异常和非运行时异常。这些异常不会影响程序的执行,只是改变改变程序的执行流程。如果程序中出现了 这种异常,那么系统就会转到专门处理此异常的代码片段(其中包含引起此异常的原因),这对于我们检测程序运行错误原因是很有帮助的。
运行时异常都是RuntimeException类及其子类异常,如NullPointException等,这些异常程序中可以选择捕获处理也可以不处理。异常一般是由于程序逻辑错误引起的,程序应该从逻辑角度应可能的避免这种异常的发生。
非运行异常是RuntimeExeption以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException,SQLException等以及用户自定义的异常(继承Exception类)
java异常中有几个很重要的关键字:try,catch,finally,throw,throws.
任何有可能抛出异常的程序片段都必须包含在try后面中的一对大括号中,同时大括号后面必须跟上catch{},里面包含所有异常的处理,因为抛出的异常可能会有不止一种所以后面的catch块相应也有多种。不过这些catch块的先后顺序有区别的。就是按继承关系放止的,子类异常要放在父类异常的前面。因为虚拟机在处理异常时,会优先处理子类异常,如果相对子类异常处理完后,后面的异常就不会再处理了。
下面举个例子说明一下:
package Exception;
class MyException extends Exception { //创建自定义异常类
String message; //定义String类型变量
public MyException(String ErrorMessagr) { //父类方法
message = ErrorMessagr;
}
public String getMessage(){ //覆盖getMessage()方法
return message;
}
}
package Exception;
public class ExceptionTest { //创建类
static int quotient(int x,int y)throws MyException{//定义方法抛出异常
if(x< 0){ //判断参数是否小于0
throw new MyException("除数不能是负数");//异常信息
}
return x/y;//返回值
}
public static void main(String args[]){ //主方法
try{
int result = quotient(-5,0);
}//调用方法quotient()
catch (MyException e) { //处理自定义异常
System.out.println(e.getMessage()); //输出异常信息
}
catch (ArithmeticException e) {
//处理ArithmeticException异常
System.out.println("除数不能为0");//输出提示信息
}
catch (Exception e) { //处理其他异常
System.out.println("程序发生了其他的异常");
//输出提示信息
}
}
}
throw后面跟上一个异常类,通常表示的是手动抛出用户自定义的异常,因为程序中的一些错误可能并不是语法错误而只是实际问题相关的逻辑错误。例如定义一个表示年龄的变量Int age=-34;显然对于虚拟机来说它并不是错误(语法错误),但在实际问题中年龄不可能也不应该是负值。如果用户输入了负值的话系统并不会抛出任何异常,程序正常运行但结果可定是错误的。这就需要在出现这种情况的时候,我们自己抛出一个异常类,让程序去处理这种错误。
throws虽然仅仅比throw多一个s,但用途完全不一样。
throws放置在一个方法名后,表示这个方法中的程序可能会抛出的异常类型(可能为用户自定义的异常也可能是系统异常)。如果是用户自定义的类型还要在引起此异常的程序语句后加上一句:throw 异常类(表示手动抛出异常)。现在这个方法只是抛出了异常,还没有考虑处理异常(当然可以加上try与catch完成异常的处理),但是有时方法并不能处理其本身抛出的异常,那么它可以把那些异常交给调用它的方法进行处理,这种现象称为回避异常。这就好比老板给员工分配任务,而员工在执行任务时遇到了问题,但是这些问题自己没有能力或是权利解觉,于是把问题交给了老板,让老板自己解决,当然老板也可以把其交给老板的老板。。。。如此循环的话就构成了异常嵌套处理。把所有异常都统一交给某个方法来进行集中处理,这样处理的效率会更高。
204

被折叠的 条评论
为什么被折叠?



