Java异常及其处理(超全讲解)

Java中的异常是指在程序运行时发生的一些错误或者异常情况。这些异常可能是由于编程错误、系统错误或者用户输入错误等引起的。为了让程序更加健壮和容错,Java提供了异常处理机制,允许程序在发生异常时进行捕获、处理和恢复。

 异常的分类:Java中异常分为两类,一类是运行时异常,另一类是非运行时异常。

 运行时异常可以在代码编写时不用显式地处理,因为Java虚拟机会自动进行处理。而非运行时异常则必须在代码中进行显式的处理,否则会导致程序的终止。

  1. 运行时异常 运行时异常是指那些可能在代码执行期间发生的异常,如数组越界、空指针引用等。这些异常不需要程序员在代码中显式地进行处理,因为Java虚拟机会自动进行处理。
  2. 非运行时异常 非运行时异常是指那些不是在代码执行期间发生的异常,如IOExceptionSQLException等。这些异常必须在代码中进行显式的处理,否则会导致程序的终止。 

Java中异常的处理主要包括三个关键字:

try、catch、finally。try块中包含可能会出现异常的代码,catch块中处理异常,finally块中释放资源。

  1. try-catch语句块 try{ //可能会出现异常的代码 }catch(Exception e){ //处理异常的代码 }

try代码块包含可能会抛出异常的代码,当异常发生时,程序会跳转到相应的catch代码块中,进行异常处理。

遇到困难不要怕,放手去try然后catch吧!!!( /^ω^)/♪♪

try-catch语句块

举个例子: 

public class Review_exception {
    public static void main(String[] args) {
        method();
    }


    public static void method() {
        int a = new Scanner(System.in).nextInt();
        int b = new Scanner(System.in).nextInt();
        System.out.println(a / b);
    }

}

(上图中定义了一个静态方法 method(),其中通过 Scanner 类从标准输入读取两个整数 ab,然后将它们相除的结果输出到标准输出。)

我们先搞出一个异常看看。

2/0 将0作为除数

抛出 java.lang.ArithmeticException 异常(异常的名称/类型)

异常的原因 /by zero 

异常的位置(java:12 java:5)可以帮助开发者快速定位问题所在。

public static void method(){
        try {int a = new Scanner(System.in).nextInt();
             int b = new Scanner(System.in).nextInt();
             System.out.println(a / b);}
    catch(ArithmeticException aaa){
            System.out.println("除数不能为0");
        }
    }
}

再次提醒格式!//try里面放出现异常的代码

//catch圆括号里放异常类型及名称

//catch花括号里面放你的处理方式

在这个修正后的代码中,我们将method()方法中的try-catch语句进行了修正。try代码块中包含需要捕获异常的代码,即通过Scanner类从标准输入读取两个整数,然后进行除法运算。如果运算过程中出现除数为零的情况,就会抛出ArithmeticException异常,此时程序会跳转到catch代码块中,输出一条提示信息。

 

如果我们觉得异常的类型也太多了,就可以用所有异常类的超类Exception,

因此使用Exception作为catch块的参数可以处理所有可能出现的异常。这也是多态的一个应用,即在catch块中不关心子类的类型,只要是Exception异常都可以被接收和处理。

public static void method(){
        try {int a = new Scanner(System.in).nextInt();
             int b = new Scanner(System.in).nextInt();
             System.out.println(a / b);}
    catch(Exception aaa){
            System.out.println("除数不能为0");
        }
    }

printStackTrace()方法

Java中的Throwable类提供了一个printStackTrace()方法,可以打印出异常的完整堆栈信息,包括异常的类型、消息、异常出现的位置以及异常发生时调用栈的信息。这个方法会在控制台输出异常的完整信息,便于我们查看异常的类型和异常发生时的调用栈,从而更好地定位和解决问题。

public static void method(){
        try {int a = new Scanner(System.in).nextInt();
             int b = new Scanner(System.in).nextInt();
             System.out.println(a / b);}
    catch(Exception aaa){
            System.out.println("除数不能为0");
            aaa.printStackTrace();
        }
    }

如图,在控制台输出了异常的完整信息!

finally语句块

在Java中,finally语句块用于定义一段无论是否发生异常都需要执行的代码。通常,我们将需要在程序结束前进行清理工作的代码放在finally语句块中,以确保这些代码在任何情况下都会被执行。

public static void method(){
        try {int a = new Scanner(System.in).nextInt();
             int b = new Scanner(System.in).nextInt();
             System.out.println(a / b);
           }
    catch(Exception aaa){
            System.out.println("除数不能为0");
        }finally{
            System.out.println("释放资源");
        }
    }

finally语句块的执行流程如下:

  1. 如果try语句块中发生了异常,Java虚拟机会跳过try语句块中的剩余代码,转而执行finally语句块中的代码。这可以用于进行资源的释放、清理等工作,以确保程序的正确性。
  2. 如果try语句块中没有发生异常,Java虚拟机也会执行finally语句块中的代码。这是因为finally语句块中的代码可能会包含一些必要的操作,比如关闭文件、释放资源等。
  3. finally块中的代码会在try块中的代码执行完毕后无论是否抛出异常都会被执行。如果finally块在catch块之前,当try块中的代码抛出异常时,程序就会直接跳转到finally块中执行,而不是执行catch块中的代码。这样会导致catch块中的代码无法执行,无法对异常进行处理。

总之流程就是:

  1. try失败了,马上转移到catch块,catch块完成后进行finally块。
  2. try成功了,跳过catch块,直接进行finally块
  3. 如果try块和catch块有return指令,finally还是会执行。

总之,finally语句块是用来执行一些必须要做的操作,无论是否出现异常,都会被执行。因此,finally语句块通常被用来进行资源的释放、清理等操作,以保证程序的正确性和可靠性。

抛出异常

在Java中,抛出异常通常用于表示程序运行时出现的异常情况,例如参数错误、文件不存在、网络连接失败等等。如果程序遇到这些异常情况,可以通过抛出异常来通知调用者,让调用者进行相应的处理。

具体格式:

public class Review_exception {
    public static void main(String[] args) throws Exception {
        method2();
    }

    public static void method2() throws Exception{
            int a = new Scanner(System.in).nextInt();//异常代码
                 int b = new Scanner(System.in).nextInt();//异常代码
                 System.out.println(a / b);//异常代码
              }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值