异常指程序运行过程中,出现的意外情况,这些意外会导致程序出错或者崩溃,从而影响程序的正常执行
java.lang.Throwable
|-----java.lang.Error:一般不编写针对性的代码进行处理。
|-----java.lang.Exception:可以进行异常的处理
|------编译时异常(checked)
|-----IOException
|-----FileNotFoundException
|-----ClassNotFoundException
|------运行时异常(unchecked,RuntimeException)
|-----NullPointerException 空指针异常
|-----ArrayIndexOutOfBoundsException 数组下标越界异常
|-----ClassCastException 类型转换异常
|-----NumberFormatException 数字格式异常
|-----InputMismatchException 输入不匹配异常
|-----ArithmeticException 算术异常
运行时异常是指编译器不要求强制处置的异常。一般是指编程时的逻辑错误,是程序员应该积极避免其出现的异常。
java.lang.RuntimeException类及它的子类都是运行时异常
编译时异常是指编译器要求必须处置的异常。编译器要求必须捕获或声明所有编译时异常。对于这类异常,如果程
序不处理,可能会带来意想不到的结果
throws抛出异常给调用者处理
public void threadSleep() throws InterruptedException { //让线程休眠1秒 Thread.currentThread().sleep(1000); }
throw抛出一个对象,该对象可分为检查异常和非检查异常
public class Student { private int stuAge; private String stuName; public int getStuAge() { return stuAge; } public void setStuAge(int stuAge) { if (stuAge < 0 || stuAge > 120) { /** * 常见的运行时异常RuntimeException及其子类属于非检查异常,可以不处理 */ throw new RuntimeException("不合法的年龄"); } this.stuAge = stuAge; } public String getStuName() { return stuName; } public void setStuName(String stuName) throws Exception { if (stuName.length() > 20) { /** * 常见的编译时异常Exception及其子类属于检查异常,必须处理 */ throw new Exception("名字长度过长"); } this.stuName = stuName; } }
无论异常是否被捕获,finally的代码一定会被执行
/** * 读取文件,假设文件存在 * * @param filePath */ public void readFile(String filePath) { FileInputStream fis = null; BufferedInputStream bis = null; try { File file = new File(filePath); fis = new FileInputStream(file); bis = new BufferedInputStream(fis); byte[] bytes = new byte[1024]; int len; while ((len = bis.read(bytes)) != -1) { System.out.println(new String(bytes, 0, len)); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { bis.close(); } catch (IOException e) { e.printStackTrace(); } try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } }
public class Student { private int stuAge; private String stuName; public int getStuAge() { return stuAge; } public void setStuAge(int stuAge) { if (stuAge < 0 || stuAge > 120) { /** * 常见的运行时异常RuntimeException及其子类属于非检查异常,可以不处理 */ throw new AgeIsIllegal("不合法的年龄"); } this.stuAge = stuAge; } public String getStuName() { return stuName; } public void setStuName(String stuName) throws NameIsLongException { if (stuName.length() > 20) { /** * 常见的编译时异常Exception及其子类属于检查异常,必须处理 */ throw new NameIsLongException("名字长度过长"); } this.stuName = stuName; } } /** * 自定义非检查异常 */ class AgeIsIllegal extends RuntimeException { public AgeIsIllegal(String message) { super(message); } } /** * 自定义检查异常 */ class NameIsLongException extends Exception { public NameIsLongException(String message) { super(message); } }