在程序运行过程中难免会出现问题,Java中有一些类专门表示常见的问题。
错误和异常
过程:先抛出异常给JRE,再由JRE捕获异常。所有相关类都是throwable 的子类
错误(error)是比较严重的问题,基本上是运行代码时JVM出现的问题,当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError
用Error类及其子类表示。
异常则一般是代码出现的问题,如方法使用的参数值为null
值,被除数是0等。
分类::
- Error类(不需要程序员处理):表示错误。
Exception。
unchecked异常是运行时异常,Exception类的子类RuntimeException及其子类表示这类异常,如不建议在代码里处理。
checked异常是非运行时异常,一般是外部问题,如处理的文件格式不对,直接在代码里处理。
异常处理原则:
异常处理不能替代用户的问题,比如用户名错误;
异常处理不能替代测试;
异常处理不能小粒度地处理,最好是整个任务放在一个try语句里。
异常处理最好在高层即父类进行。
常见unchecked异常处理方法:
ArithmeticException,举例:
int b=0;
if(b != 0) {
System.out.println(1/b);
}
NullPointerException,举例:
String str=null;
if(str!=null) {
System.out.println(str);
}
ClassCastException,举例:
User u = new Student();
if(u instanceof Teacher) {
Teacher t = (Teacher) u;<>Teacher和Student均为User的子类<>
}
ArrayIndexOutOfBoundsException,举例:
int[] a = new int[5];
int l = 10;
if(l<a.length) {
System.out.println(a[l]);
}
NumberFormatException,举例:
String s = "123abc";
Pattern p = Pattern.compile("^\\d+$");
Matcher m = p.matcher(s);
if(m.matches()) {
int num = Integer.parseInt(s);
}
try/catch语句
如果异常可能会导致编译通不过,那么必须要用try/catch语句来处理。
try语句:放入可能出现异常的一段代码。
catch语句:放入异常处理代码,
finally语句:无论异常是否发生,一定会执行的语句,一般不要设置return语句,否则会覆盖前面语句的返回结果。
举例:
FileReader reader = null;
try {
reader = new FileReader("d:");
char c = (char) reader.read();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(reader != null) {
reader.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
throw/throws 语句
用throws
声明异常后,调用这个对象的时候才需要处理异常。
不建议在main里调用的时候继续声明,不然就会抛给JRE。
子类声明异常的条件:
不能超过父类的异常等级,即不能抛异常类的父类或上层类;
声明的异常不能是父类异常的同级别异常的子类异常。
public void run() throws IOException{...}
如果想在方法体内抛异常,就需要使用throw
关键词,后面跟着异常对象而不仅仅是异常类,举例:
public void run(){
throw new FileNotFoundException("file not found!");
}