Java异常总结
异常:指的是程序在执行过程中,出现的非正常的情况下,最终导致jvm的非正常停止。Java处理异常的方式是中断处理。
异常的根类是java.lang.throwable
,分为error
和exception
以及runtimeException
三类,error
是程序运行时出错,不可避免,exception
是编译错误,必须throws给方法调用者进行处理。runtimeexception
可以不用抛出throws,但是也会抛给方法调用者进行处理。
throw和throws都需要抛出异常给调用者,但是他们的编译要求不同,只需要throw的异常是运行时异常,不可避免的,不强制要求catch,属于我们的代码问题,应该由编写者进行规避,如果是编译时异常,那么必须进行throws抛出,然后进行处理
Throwable中的常用方法:
-
public void printStackTrace()
:打印异常的详细信息。包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。
-
public String getMessage()
:获取发生异常的原因。提示给用户的时候,就提示错误原因。
-
public String toString()
:获取异常的类型和异常描述信息(不用)。
异常处理流程
throw异常
throw异常是运行时异常,用户在使用时产生的代码错误,其根本原因是我们的程序逻辑未考虑完全,需要进行完善。
栗子:
声明了一个runtimeException:
package anomalyCode.demo3;
/*
*自定义异常必须继承异常类,异常类有编译时异常:Exception和
* 运行时异常:RuntimeException
* */
public class AgeOutOfBound extends runtimeException{
public AgeOutOfBound() {
System.out.print("Sorry,age out of bound !");
}
}
然后可以不使用throws抛出改方法:
package anomalyCode.demo3;
public class AgeInput {
public static void checkAage(int age) { //用关键字throws指明调用此方法可能抛出的异常
if(age>0 && age<200){
System.out.print("right!");
}else{
System.out.println("---------------");
throw new AgeOutOfBound(); //抛出异常用关键字throw
}
}
}
最后调用时catch异常:
package anomalyCode.demo3;
/*1.异常分为编译时异常和运行时异常,那么编译时异常必须
*在程序中处理,即必须有个catch方法。必须通过throws抛出给方法调用者进行处理,
* 当我们进行自定义异常时,其属于编译时异常,需要throws抛出。
* 2.运行时异常则是不需要throws进行抛出,只需要声明即可。
* 3.捕获异常后,程序会继续执行。
*
* */
public class demo {
public static void main(String[] args) {
int age = 300;
try {
AgeInput.checkAage(age);
} catch (AgeOutOfBound e) {
System.out.println("Are you rellly :" + age + " years old?");
}finally {
System.out.println("执行了finall");
}
System.out.println("hello");
}
}
throws抛出异常
throws是编译时异常,必须在方法后面进行抛出,可以同时抛出多个异常给方法调用者,直至找到对应的catch。
声明了一个exception:
package anomalyCode.demo3;
/*
*自定义异常必须继承异常类,异常类有编译时异常:Exception和
* 运行时异常:RuntimeException
* */
public class AgeOutOfBound extends Exception{
public AgeOutOfBound() {
System.out.print("Sorry,age out of bound !");
}
}
然后必须使用throws抛出改方法:
package anomalyCode.demo3;
public class AgeInput {
public static void checkAage(int age) throws AgeOutOfBound { //用关键字throws指明调用此方法可能抛出的异常
if(age>0 && age<200){
System.out.print("right!");
}else{
System.out.println("---------------");
throw new AgeOutOfBound(); //抛出异常用关键字throw
}
}
}
最后调用时catch异常:
package anomalyCode.demo3;
/*1.异常分为编译时异常和运行时异常,那么编译时异常必须
*在程序中处理,即必须有个catch方法。必须通过throws抛出给方法调用者进行处理,
* 当我们进行自定义异常时,其属于编译时异常,需要throws抛出。
* 2.运行时异常则是不需要throws进行抛出,只需要声明即可。
* 3.捕获异常后,程序会继续执行。
*
* */
public class demo {
public static void main(String[] args) {
int age = 300;
try {
AgeInput.checkAage(age);
} catch (AgeOutOfBound e) {
System.out.println("Are you rellly :" + age + " years old?");
}finally {
System.out.println("执行了finall");
}
System.out.println("hello");
}
}
使用try…catch后,主程序能够继续向下执行,但是调用程序(子程序中断)。