异常就是抛出和捕获的过程,也就是try和catch,当保护代码块try中出现异常时,catch中的内容就会被检查。以下内容为参考了一些博客后加上自己理解的一些记录。
一、:什么是异常
二、:java中异常的分类
Java中的异常是有很多的,不过可大体上分为三类:检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个
不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误
就发生了,它们在编译也检查不到的。
所有的异常类是从java.lang.Exception类继承的子类。Exception类是Throwable类的子类。除了Exception类外,Throwable还有一个子类Error 。Java程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。
异常类有两个主要的子类:IOException类和RuntimeException类。
Exception它又分为两种CheckedException(受捡异常),UncheckedException(不受检异常)。其中CheckException发生在编译阶段,必须要使用try…catch(或者throws)否则编译不通过。而不受检测的异常发生在运行期,具有不确定性,主要是由于程序的逻辑问题所引起的。IOException是编译异常,RuntimeException是运行异常。
三、:throw和throws
对于我这样的初学者而言,这两个有点傻傻分不清,那就来从原理和使用方式上来辨析一下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> 继续执行
四、:自定义异常
Java确实给我们提供了非常多的异常,但是异常体系是不可能预见所有的希望加以报告的错误,所以Java允许我们自定义异常来表现程序中可能会遇到的特定问题,总之就是一句话:我们不必拘泥于Java中已有的异常类型。所有异常都必须是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);
}
}
}
五、:异常方法
下面的列表是Throwable 类的主要方法:也就是其子类中都可以使用的。1、public String getMessage() 返回发生异常的详细信息。
2、public Throwable getCause() 返回异常的原因。
3、public String toString() 返回类的串级名字。
4、public Stack printStackTrance() 打印错误输出流。
六、:总结
1、尽量减少try块,不能使用一个来包含所有的异常2、充分利用所有的finally关键字,保证所有的资源都被释放
3、catch语言应该尽量指定具体的异常类型
4、要对捕获的异常做处理,不能简单的打印。