异常哪些类型
RuntimeException(unchecked exception):
编译时,不会提示和发现这样的异常,不要求立刻处理这些异常。所以我们可以使用try…catch…finally处理异常,也可以不处理。
对于这些异常,应该修正,而不是去通过异常处理器处理 。这样的异常发生的原因多半是代码写的有问题。
Exception(checked exception):
强制要求处理,使用try…catch…finally或者throws。
异常怎样产生
unchecked Exception
如除0错误ArithmeticException,错误的强制类型转换错误ClassCastException,数组索引越界ArrayIndexOutOfBoundsException,使用了空对象NullPointerException等等
public class Test13 {
public static void main(String[] args) {
//unchecked Exception调用不会出现异常
method();
}
private static void method() {
int a = 10;
int b = 0;
try {
//发生异常, ArithmeticException extends RuntimeException
//可以不处理但是运行时会报异常,也可以用try catch处理.
System.out.println(a / b);
} catch (ArithmeticException e) {
e.printStackTrace();
}
//try catch后面的代码可以运行
System.out.println("mark");
}
}
checked Exception
除了error和RuntimeException之外的异常
throw
主动抛出异常.
用在方法体内, 后面跟异常对象(Exception or RuntimeException…, new MyException (? extends exception or RuntimeException)), 可以是java提供的异常, 也可以是自定义继承自Exception或者RuntimeException, 但只能抛一个异常.
throw仅仅代表这里抛出了一个异常. 然后再根据这个异常的类型进行对应的处理.
class Student {
private int score;
/*主动抛出编译异常,ExceptionScore extends Exception.
要么在这里try catch,要么throws给调用者,由调用者try catch或抛出.*/
void setScore(int score) {
if (score > 100 || score < 0) {
try {}
throw new ExceptionScore("分数在0-100之间");
} catch (ExceptionScore exceptionScore) {
exceptionScore.printStackTrace();
}
} else {
this.score = score;
}
}
}
异常如何处理
throws
用在方法声明后面, 可以跟单个和多个异常名,逗号隔开. 表示抛出异常, 后续程序无法运行. 由调用者来处理, try…catch…或者throws给JVM.
throws仅仅表示有可能抛出异常, 异常不一定发生.
try…catch…finally
用在方法中, 将异常division包裹, 范围越小越好. 可以同时catch多个异常. 后面的语句可以接着走完.
选择: 异常自己能处理就try catch, 如果不能处理就用throws; main中一般用try catch.