异常的三种类型
-
Error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
-
RuntimeException表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。比如,如果数组索引扩展不超出数组界限,那么ArrayIndexOutOfBoundsException异常从不会抛出。比如,这也适用于取消引用一个空值对象变量。因为一个正确设计和实现的程序从不出现这种异常,通常对它不做处理。这会导致一个运行时信息,应确保能采取措施更正问题,而不是将它藏到谁也不注意的地方。
-
其他异常表示一种运行时的困难;它通常由环境效果引起,可以进行处理。具体实例包括文件未找到或无效URL异常(用户打了一个错误的URL)。
(摘自《java 7从入门到精通》 张峰 编著)
(图片来源 《java教程(第四版)》马朝辉 等译)
错误(Error)和运行时异常(RuntimeException)合称为不可控异常;
其他异常属于可控异常,可控异常必须在方法中用throws声明。
至于运行时异常,是你程序写的有问题,就是有bug,你要去修改程序,当然也可以用throws声明。
常见异常类型
算术运算异常(ArithmeticException)
数组下标越界异常(ArrayIndexOutOfBoundsException)
数组元素类型不匹配异常(ArrayStoreException)
强制类型转化异常(ClassCastException)
索引越界异常(IndexOutOfBoundsException)
空指针异常(NullPointerException)
数字格式转换异常(NumberFormatException)
字符串索引越界异常(StringIndexOutOfBoundsException)
操作错误(UnsupportedOperationException)
找不到指定类(ClassNotFoundException)
请求方法不存在(NoSuchMethodException)
无法访问异常(IllegalAccessException)
非法参数异常(IllegalArgumentException)
可以到jdk帮助文档查看更多异常类型
自定义异常类
系统中的异常类是有限的,开发中会出现各种异常,自定义异常类就很重要了
class 类名 extends ExceptionType{
code
}
自定义异常类需要继承Exception类或其子类
package pc;
public class demo4 {
static void fun(int n) throws MyException {
if(n < 0){
MyException e = new MyException(n);
throw(e); //抛出异常
}
double number = Math.sqrt(n);
System.out.println(n + "的平方根:" + number);
}
public static void main(String[] args) {
try {
fun(-5);
} catch (MyException e) {
System.out.println(e.getMessage());
// e.printStackTrace(System.out); //使用这句代码,输出的就和系统异常类输出的一样
//在这指定了输出流System.out,printStackTrace()默认使用了System.err输出流进行输出,与System.out是两个不同的输出流
}
}
}
// 自定义异常类
class MyException extends Exception {
String message;
MyException(int n){
message=n + "不是正数";
}
public String getMessage() {
return message;
}
}