异常中断程序问题
一旦出现,会终止程序
常见的能够终止程序的异常
一旦触发此类异常,程序将就此终止
NullPointerException: 空指针异常
异常信息
Exception in thread "main" java.lang.NullPointerException
at com.itpm.project.ExceptionHandlingTest.nullPointerException(ExceptionHandlingTest.java:22)
at com.itpm.project.ExceptionHandlingTest.main(ExceptionHandlingTest.java:8)
ArithmeticException: 算数异常
异常信息
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.itpm.project.ExceptionHandlingTest.ArithmeticException(ExceptionHandlingTest.java:46)
at com.itpm.project.ExceptionHandlingTest.main(ExceptionHandlingTest.java:11)
RuntimeException: 运行时异常
异常信息
Exception in thread "main" java.lang.RuntimeException
at com.itpm.project.ExceptionHandlingTest.runtimeExceptionTest(ExceptionHandlingTest.java:40)
at com.itpm.project.ExceptionHandlingTest.main(ExceptionHandlingTest.java:14)
异常处理的准则
1.释放资源必须放置到finally从句中
2.尽可能地缩小try...catch语句的监控范围
3.优先使用专用的异常类处理异常,最后再使用Exception异常来处理
4.在catch从句中,尽可能地恢复异常或详细地输出异常信息
finally从句的特性
1.无论程序运行是否发生异常,发生任何异常,finally从句中的代码都会被执行,即便在try和catch中使用return也不会影响finally从句中的代码的执行;除非是try和catch中使用了System.exit
2.在finally从句中,可以存放回收资源的代码,如释放数据库连接,释放IO对象,清空集合,设置大对象为null,以减少大对象上的强引用,从而提升大对象的回收时间
代码展示
public class ExceptionHandlingTest {
public static void main(String[] args) {
/* 无异常正常运行方法 */
noAbnormalities();
System.out.println("-----------------");
/* 有异常正常运行方法 */
thereIsAbnormal();
System.out.println("-----------------");
/* 有return的无异常正常运行方法 */
haveRETURNOfNoAbnormalities();
System.out.println("-----------------");
/* 有return的存在异常正常运行方法 */
haveRETURNOfThereIsAbnormal();
System.out.println("-----------------");
/* 执行System.exit的无异常方法 */
useSystemExitNoAbnormalities();
System.out.println("-----------------");
/* 执行System.exit的无异常方法 */
useSystemExitThereIsAbnormal();
System.out.println("-----------------");
}
public static void noAbnormalities() {
try {
System.out.println("代码无异常 try 已运行");
} catch (Exception e) {
System.out.println("代码存在异常 catch 已运行");
e.printStackTrace();
} finally {
System.out.println("finally 已运行");
}
}
public static void thereIsAbnormal() {
try {
int i = 1 / 0;
System.out.println("代码无异常 try 已运行");
} catch (Exception e) {
System.out.println("代码存在异常 catch 已运行");
e.printStackTrace();
} finally {
System.out.println("finally 已运行");
}
}
public static void haveRETURNOfNoAbnormalities() {
try {
System.out.println("代码无异常 try 已运行 代码块中return将运行");
return;
} catch (Exception e) {
System.out.println("catch 已运行");
e.printStackTrace();
return;
} finally {
System.out.println("return运行结束 finally 已运行");
}
}
public static void haveRETURNOfThereIsAbnormal() {
try {
int i = 1 / 0;
System.out.println("try 已运行");
return;
} catch (Exception e) {
System.out.println("代码存在异常 catch 已运行 代码块中return将运行");
e.printStackTrace();
return;
} finally {
System.out.println("return运行结束 finally 已运行");
}
}
public static void useSystemExitNoAbnormalities() {
try {
System.out.println("try 已运行, System.exit方法将执行");
/* 正常结束当前正在运行的Java虚拟机 */
System.exit(0);
} catch (Exception e) {
System.out.println("代码存在异常 catch 已运行 System.exit方法将执行");
e.printStackTrace();
/* 正常结束当前正在运行的Java虚拟机 */
System.exit(0);
} finally {
System.out.println("System.exit方法已执行 finally 已运行");
}
}
public static void useSystemExitThereIsAbnormal() {
try {
int i = 1 / 0;
System.out.println("try 已运行, System.exit方法将执行");
/* 正常结束当前正在运行的Java虚拟机 */
System.exit(0);
} catch (Exception e) {
System.out.println("代码存在异常 catch 已运行 System.exit方法将执行");
e.printStackTrace();
/* 正常结束当前正在运行的Java虚拟机 */
System.exit(0);
} finally {
System.out.println("System.exit方法已执行 finally 已运行");
}
}
}