# 异常处理

# try-catch块

现在我们从玩家那里得到了他们输入的数字a和b. 现在我们算一算a除以b是多少.

但是有个问题, 玩家会不会恶作剧把b输入一个0进来呢? 这样会报错.
也许你会说, 用if判断一下a和b是不是在某个取值范围内就可以了. 对, 就应该是这样, 大家都是这样干的.

这里想告诉你的是, 在你能大概预感到某个代码会报错时, 你可以用try-catch来捕获它.
我们假设我们能预判出来double c=a/b;这句代码会报错, 还不用if的话.

int a=1,b=0;
// double c = a/b; 这样肯定是报错的

try{
    //把你认为要报错的代码套在这里
    double c = a/b;
}catch(Exception e){ 
    //这里的Exception应该精确到具体的错误类型
    //因为想捕获所有的错误, 所以写了Exception
    System.out.println("报错了!");
    e.printStackTrace(); //输出报错信息
}
System.out.println("hi!");

你可以试试看, 如果没有try-catch, 该方法的某句代码报错后会立刻停止运行该方法, 而try-catch中报错的话会绕过这块内容, 继续输出下面的hi!.

try-catch捕获的实际上是Exception对象. 有很多种Exception对象.

在实际开发中, 没有必要把所有的代码都套上try-catch, 那样没什么用. 只需要套上你认为会报错的代码即可.

# 抛出错误

//这是我们自己写的方法
public void a(){
    throw new Exception("只要执行我, 我就会报错");
}

利用throw语句, 我们的a方法只要被调用, 它就会抛出错误.
由此可见, throw可以抛出一个Exception对象.

你也可以定义一个自己的类, 继承自Exception, 来抛出自己的Exception对象.

# Error

Exception是可以被捕获的, 但是Error是不可以被捕获的.
JVM错误, 例如内存不足、崩溃等影响程序继续运行的问题, JVM会抛出一个Error.