Java中的异常处理机制

什么是异常,java提供异常处理机制有什么用?

以下程序执行过程中发生了不正常的情况,而这种不正常的情况叫做:异常

  public static void main(String[] args) {
        int a = 10;
        int b = 0;
        int c = a / b;
        System.out.println(a + "/" + b + "=" + c);
 //此时程序执行控制台出现了:
    Exception in thread "main" java.lang.ArithmeticException: / by zero
	    at com.bjpowernode.javase.exception.ExceptionTest01.main(ExceptionTest01.java:14)
	这个信息被我们称为:异常信息。这个信息是JVM打印的。

java语言是很完善的语言,提供了异常的处理方式,以下程序执行过程中出现了不正常情况,java把该异常信息打印输出到控制台,供程序员参考。程序员看到异常信息之后,可以对程序进行修改,让程序更加的完善。
什么是异常:程序执行过程中的不正常情况。
异常的作用:增强程序的健壮性。

如何处理异常?

处理异常的第一种方式:
在方法声明的位置上使用throws关键字抛出,谁调用我这个方法,我就抛给谁。抛给调用者来处理。这种处理异常的态度:上报。

 // 一般不建议在main方法上使用throws,因为这个异常如果真正的发生了,一定会抛给JVM。JVM只有终止。
 // 异常处理机制的作用就是增强程序的健壮性。怎么能做到,异常发生了也不影响程序的执行。所以
 // 一般main方法中的异常建议使用try..catch进行捕捉。main就不要继续上抛了
 public static void main(String[] args) throws FileNotFoundException {
        System.out.println("main begin");
        //调用m1方法时也会出现异常
        //此时用throws关键字向上抛
        m1();
        // 以上代码出异常,这里是无法执行的。
        System.out.println("main over");
    }
    public static void m1() throws FileNotFoundException{
     //此时会出现异常,我们选择以throws关键字抛出
     //在方法名后面加上一串代码 throws FileNotFoundException
       new FileInputStream("D:\\java\\javase.txt");
       }

处理异常的第二种方式:
使用try…catch语句对异常进行捕捉。
这个异常不会上报,自己把这个事儿处理了。
异常抛到此处为止,不再上抛了。

 public static void main(String[] args){
       System.out.println("main begin");
          m1();
       System.out.println("main over");
 }
  public static void m1(){
  //这就是使用try catch 捕捉异常
     try {
           new FileInputStream("D:\\java\\javase.txt");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
       }

注意:
只要异常没有捕捉,采用上报的方式,此方法的后续代码不会执行。
另外需要注意,try语句块中的某一行出现异常,该行后面的代码不会执行。
try…catch捕捉异常之后,后续代码可以执行。
在以后的开发中,处理编译时异常,应该上报还是捕捉呢,怎么选?
如果希望调用者来处理,选择throws上报。其它情况使用捕捉的方式。

异常的分类

1、Throwable下有两个分支:Error(不可处理,直接退出JVM)和Exception(可处理的)
Exception下有两个分支:
Exception的直接子类:编译时异常(要求程序员在编写程序阶段必须预先对这些异常进行处理,如果不处理编译器报错,因此得名编译时异常。)。
RuntimeException:运行时异常。(在编写程序阶段程序员可以预先处理,也可以不管,都行。)

2、编译时异常和运行时异常,都是发生在运行阶段。编译阶段异常是不会发生的。
编译时异常因为什么而得名?
因为编译时异常必须在编译(编写)阶段预先处理,如果不处理编译器报错,因此得名。所有异常都是在运行阶段发生的。因为只有程序运行阶段才可以new对象。因为异常的发生就是new异常对象。

3、编译时异常和运行时异常的区别?
编译时异常一般发生的概率比较高。
举个例子:
你看到外面下雨了,倾盆大雨的。
你出门之前会预料到:如果不打伞,我可能会生病(生病是一种异常)。
而且这个异常发生的概率很高,所以我们出门之前要拿一把伞。
“拿一把伞”就是对“生病异常”发生之前的一种处理方式。
对于一些发生概率较高的异常,需要在运行之前对其进行预处理。

运行时异常一般发生的概率比较低。
举个例子:
小明走在大街上,可能会被天上的飞机轮子砸到。
被飞机轮子砸到也算一种异常。
但是这种异常发生概率较低。
在出门之前你没必要提前对这种发生概率较低的异常进行预处理。
如果你预处理这种异常,你将活的很累。

假设你在出门之前,你把能够发生的异常都预先处理,你这个人会更加
的安全,但是你这个人活的很累。
假设java中没有对异常进行划分,没有分为:编译时异常和运行时异常,所有的异常都需要在编写程序阶段对其进行预处理,将是怎样的效果呢?首先,如果这样的话,程序肯定是绝对的安全的。但是程序员编写程序太累,代码到处都是处理异常
的代码。

4、编译时异常还有其他名字:
受检异常:CheckedException
受控异常

5、运行时异常还有其它名字:
未受检异常:UnCheckedException
非受控异常
6、再次强调:所有异常都是发生在运行阶段的。

自定义异常

1、SUN提供的JDK内置的异常肯定是不够的用的。在实际的开发中,有很多业务,
这些业务出现异常之后,JDK中都是没有的。和业务挂钩的。那么异常类我们
程序员可以自己定义吗?可以。

2、Java中怎么自定义异常呢?
两步:
第一步:编写一个类继承Exception或者RuntimeException.
第二步:提供两个构造方法,一个无参数的,一个带有String参数的。

 // 定义编译时异常
public class MyException extends Exception{
    public MyException(){

   }
   public MyException(String s){
        super(s);
    }
}

 // 定义运行时异常
public class MyException extends RuntimeException{

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值