异常就是抛出和捕获的过程,也就是try和catch,当保护代码块try中出现异常时,catch中的内容就会被检查。以下内容为参考了一些博客后加上自己理解的一些记录。
检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个
不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误
就发生了,它们在编译也检查不到的。
所有的异常类是从java.lang.Exception类继承的子类。Exception类是Throwable类的子类。除了Exception类外,Throwable还有一个子类Error 。Java程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。
异常类有两个主要的子类:IOException类和RuntimeException类。
Exception它又分为两种CheckedException(受捡异常),UncheckedException(不受检异常)。其中CheckException发生在编译阶段,必须要使用try…catch(或者throws)否则编译不通过。而不受检测的异常发生在运行期,具有不确定性,主要是由于程序的逻辑问题所引起的。IOException是编译异常,RuntimeException是运行异常。
package TwoWeek; public class Exception1 { public static void main(String args[]){ try{ System.out.println(9/0); } catch(Exception e){ System.out.println(e.toString()); } finally{ System.out.println("继续执行"); } } }
输出结果:java.lang.ArithmeticException: / by zero <span style="white-space:pre"> </span> 继续执行
所有异常都必须是Throwable的子类。
如果希望写一个检查性异常类,则需要继承Exception类。
如果你想写一个运行时异常类,那么需要继承RuntimeException 类。
Java自定义异常的使用要经历如下四个步骤:
1、定义一个类继承Throwable或其子类。
2、添加构造方法(当然也可以不用添加,使用默认构造方法)。
3、在某个方法类抛出该异常。
4、捕捉该异常。
package TwoWeek; class MyException extends Exception{ public MyException(String str){ // 将异常的信息上传了 super(str); } public void display(){ System.out.println("哈哈"); } } public class ExceptionSelf{ public static void main(String args[]){ ExceptionSelf test = new ExceptionSelf(); try { test.display(0); } catch (MyException e) { System.out.println(e.toString()); } } public void display(int i) throws MyException{ if(i == 0){ throw new MyException("这里有异常了"); } else{ System.out.println(9/i); } } }
1、public String getMessage() 返回发生异常的详细信息。
2、public Throwable getCause() 返回异常的原因。
3、public String toString() 返回类的串级名字。
4、public Stack printStackTrance() 打印错误输出流。
2、充分利用所有的finally关键字,保证所有的资源都被释放
3、catch语言应该尽量指定具体的异常类型
4、要对捕获的异常做处理,不能简单的打印。