发现错误最理想的时机是在编译阶段,也就是你试图运行程序之。然而编译期间并不能找出所有的错误,余下的问题必须在运行期间解决。
而在我们面对异常 的时候我们有两种选择:捕获异常或者抛出异常再进行异常处理,如果不管它,程序直接就停了;
我们通过try catch去捕获异常:
try{
要监控的,可能出现异常的语句;
}catch(异常类1 对象) {
...
}catch(异常类2 对象) {
...
}
finally{
异常的出口
}
try后面一定要有catch或者finally或者两个都有。
catch语句块可以自定义处理语句,或者使用异常类的方法。
例:
e.getCause():获取异常原因,获取Cause
e.toString(): 获取异常种类和错误信息
e.getMessage(): 获取错误信息
e.printStackTrace(): 对象的堆栈跟踪输出至错误输出流,放在System.err中,并在控制台打印出来,包括异常种类,错误信息,错误位置。
finally块是无论是否有异常出现都会执行的代码;
关于try catch finally执行的流程:try中的代码 ——(没有异常)——> finally代码
try中的代码——(出现异常)——> catch中的代码 ——>finally代码
我们通过throw或者throws抛出异常:
throws是在方法名后面声明方法在执行过程可能出现的异常并且把异常抛给上层处理,上层选择try-catch处理或者继续抛出异常给上上层,如果一直抛出,最终会抛给JVM,JVM打印异常消息和堆栈异常。
public class Test {
public static void main(String[] args) {
try{
System.out.println(cal(2,0));
}catch (Exception e) {
e.printStackTrace();
}
}
public static int cal(int x, int y) throws Exception {
return x/y;
}
}
throw是在方法体中抛出一个异常,一般是在代码块的内部,当程序出现某种逻辑错误时由程序员 主动 抛出某种特定类型的异常。常用在当系统检查不出异常,而你又想在此处抛出异常;
public static void main(String[] args) {
try {
throw new Exception("此处抛出异常");
}catch (Exception e) {
e.printStackTrace();
}
}