Java中异常的简单解释

Java中的异常

异常Exception分为两类,一类是编译时异常(除RuntimeException外的Exception以及它的直接子类),一类是运行时异常(RuntimeException以及它的子类)。

  • 编译时异常

编译时异常是一种发生概率较高的异常,在编写程序时必须预先对它进行处理,否则编译器不能通过。它是发生在程序运行阶段的异常,又被称为受检异常或受控异常。

  • 运行时异常

运行时异常是一种发生概率较低的异常,在编写程序阶段可不对它进行处理。它是发生在程序运行阶段的异常,又被称为不受检异常或不受控异常。

  • 异常的两种处理方式

1. 在方法的声明位置上,使用throws关键字,将异常向上一级抛出。

若异常发生后,异常一直上抛,直到抛给了JVM,则程序终止执行。如下所示:

package com.pyi.blog;

public class ExceptionTest1 {
    public static void main(String[] args) throws Exception {
        int a=10;
        int b=0;
        System.out.println(a+"/"+b+"="+a/b);
        System.out.println("111");
    }
}

运行结果如下:

在这里插入图片描述

在上面这段程序中,在main方法中发生了算术异常,而main( )方法中并未对其进行捕捉而是向上抛出,抛给了JVM,JMV无法对其进行处理,因此程序终止执行,后面的代码无法运行。在这段程序中,也可以不手动定义main( )方法中对异常的处理,因为ArithmeticException的父类为RuntimeException,它们属于运行时异常,可以不再编写程序阶段对该异常进行异常处理。

package com.pyi.blog;

public class ExceptionTest2 {
    public static void main(String[] args) {
        ExceptionTest2 e=new ExceptionTest2();
        e.myException();
    }
    public void myException() throws MyException{

    }
}
class MyException extends Exception{
    
}

在上面这段程序中自定义了一个异常类MyException,它的直接父类为Exception,因此它为编译时异常。在myException( )方法声明时抛出了该异常,表示在执行此方法时很可能发生这种异常。因此在调用这个方法处,要对这种异常进行处理,否则编译器报错。如下图所示:

在这里插入图片描述

在调用myException( )方法处,对MyException异常进行抛出。

在这里插入图片描述

此时编译器通过。

2. 使用try-catch关键字对异常进行捕捉。

try{}尝试运行的代码,catch(){}指捕捉异常。

package com.pyi.blog;

public class ExceptionTest2 {
    public static void main(String[] args)  {
        ExceptionTest2 e=new ExceptionTest2();
        try{
            e.myException();
            System.out.println("111");
        }catch(MyException ex){
            System.out.println("222");
        }
		System.out.println("333");
    }
    public void myException() throws MyException{
        throw new MyException();
    }
}
class MyException extends Exception{
    public MyException() {
    }

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

}

在上段程序中,在main( )方法中对MyException类的异常做了捕获处理,因此try-catch后面的代码可以执行,而try的花括号内,因为第一行发生了异常,因此后面对“111”的打印不能完成。运行结果如下:

在这里插入图片描述

方法中出现异常,如果采取上报的方式,则此方法结束。

try后面也可以使用多个catch捕捉不同的异常:

package com.pyi.blog;

public class ExceptionTest2 {
    public static void main(String[] args)  {
        ExceptionTest2 e=new ExceptionTest2();
        try{
            e.myException2();
            e.myException();
            System.out.println("111");
        }catch(MyException ex){
            System.out.println("222");
            System.out.println(ex);
        }catch(MyException2 ex2){
            System.out.println("aaa");
        }
        System.out.println(333);
    }
    public void myException() throws MyException{
         throw new MyException();
    }
    public void myException2() throws MyException2{
        throw new MyException2();
    }
}
class MyException extends Exception{
    public MyException() {

    }

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

}
class MyException2 extends Exception{

}

运行结果如下:

在这里插入图片描述

catch后面的参数可以是具体的异常类型,也可以是一个父类,使用多态的形式。可以使用多个catch,在使用多个catch时要注意父类的异常放在子类异常的后面。

JDK8或以后,多个异常参数可以用“或”(|)连接。如:catch(MyExCeption|MyException2|MyException3)

  • 异常对象中的两个重要方法

1. getMessage( )

getMesage( )方法的作用是获取此可抛出对象的详细消息字符串 。如下所示:

package com.pyi.blog;

public class ExceptionMessageTest {
    public static void main(String[] args) {
        Exception e=new ArithmeticException("算术异常发生!");
        String s=e.getMessage();
        System.out.println(s);
    }
}

运行结果如下:

在这里插入图片描述

2.printStackTrace( )

printStackTrace( )方法的作用是将此可抛出对象及其回溯打印到指定的打印程序。 。如下所示:

package com.pyi.blog;

public class ExceptionMessageTest {
    public static void main(String[] args) {
        Exception e=new ArithmeticException("算术异常发生!");
        String s=e.getMessage();
        System.out.println(s);
        e.printStackTrace();
        System.out.println("111");
    }
}

运行结果如下:

在这里插入图片描述

  • finally语句

finally必须与try-catch一起使用,它里面的代码一定会执行。

package com.pyi.blog;

public class FinallyTest {
    public static void main(String[] args) {
        try{
            exception();
        }catch(MyException0 e){
            System.out.println("111");
        }finally{
            System.out.println("222");
        }

    }
    public static void exception() throws MyException0{
        throw new MyException0();
    }
}
class MyException0 extends Exception{

}

运行结果如下:

在这里插入图片描述

可以不写catch,try与fianlly连用。

package com.pyi.blog;

public class FinallyTest1 {
    public static void main(String[] args) {
        try{
            System.out.println("111");
            return ;
        }finally {
            System.out.println("222");
        }
    }
}

运行结果如下:

在这里插入图片描述

在上面这段程序中,先执行try中的System.out.println(“111”),然后执行finally中的代码,最后执行try中的return。因此finally花括号中的代码一定会执行。

try或fianlly不能单独使用。

  • 自定义异常

可以自定义一个异常类,让它继承Exception或者继承RuntimeException,然后为它添加有参和无参构造方法。如下所示:

package com.pyi.blog;

 public class MyExceptionTest extends Exception{
    public MyExceptionTest() {

    }

    public MyExceptionTest(String message) {
        super(message);
    }
}
package com.pyi.blog;

public class MyExceptionTest2 extends RuntimeException{
    public MyExceptionTest2() {
    }

    public MyExceptionTest2(String message) {
        super(message);
    }
}
package com.pyi.blog;

public class ZiDingYiExceptionTest {
    public static void main(String[] args) {
        MyExceptionTest e=new MyExceptionTest("编译时异常");
        String s=e.getMessage();
        System.out.println(s);
        e.printStackTrace();
        MyExceptionTest2 e2=new MyExceptionTest2("运行时异常");
        String s2=e2.getMessage();
        System.out.println(s2);
        e2.printStackTrace();
    }
}

运行结果如下:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java异常机制是一种用于处理程序执行期间可能出现的错误情况的机制。Java异常分为两类:受检异常(Checked Exception)和非受检异常(Unchecked Exception)。其,受检异常必须在代码进行捕获和处理,否则编译器将会报错。而非受检异常则不需要在代码进行捕获和处理,但是如果不进行处理,会导致程序的异常终止。 Java异常机制通过抛出异常对象来表示程序出现的异常情况,通常情况下,异常对象包含了异常的类型、异常的消息以及异常发生的位置等信息。当程序执行过程出现异常情况时,就会抛出相应的异常对象,这个异常对象会被传递给调用栈上的上层方法,直到被捕获或者到达程序的顶层方法。 Java异常机制主要由三个关键字来实现:try、catch和finally。try块包含可能抛出异常的代码,catch块用于捕获并处理异常,finally块则用于执行一些必须要完成的代码,无论是否抛出异常都会执行。 下面是一个简单Java异常处理的例子: ``` public class ExceptionDemo { public static void main(String[] args) { try { int num = Integer.parseInt(args[0]); System.out.println("10 / " + num + " = " + (10 / num)); } catch (ArithmeticException e) { System.out.println("除数不能为0"); } catch (NumberFormatException e) { System.out.println("请输入数字"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("请至少输入一个参数"); } finally { System.out.println("程序执行完毕"); } } } ``` 在这个例子,我们使用了try-catch-finally关键字来处理用户输入的参数,当输入参数不满足条件时,就会抛出相应的异常。catch块用于捕获并处理异常,finally块则用于执行一些必须要完成的代码,无论是否抛出异常都会执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值