java知识点详解——异常

当输入的数不是整数时 会报错

当输入的被除数为0时 会报错

在以前我们会使用if—else语句用来堵住漏洞,但是那样相当繁琐,很难穷举所有错误

Scanner in = new Scanner(System.in);
System.out.print("请输入被除数:");
int num1 = in.nextInt();
System.out.print("请输入除数:");
int num2 = in.nextInt();
System.out.println(num1+"/"+ num2 +"="+ num1/ num2);
System.out.println("感谢使用本程序!");

异常:

程序中预先设置好 对付异常的处理办法

异常在java中被封装成了各种异常类,所有异常类都是Throwable的子类,Error类和Exception类。

Error类

表示仅仅靠程序本身无法恢复的严重错误,比如内存溢出,虚拟机错误等

Exception类

由Java应用程序抛出和处理的非严重错误,比如算术运算出错,数组下标越界,类型转换异常等。

Exception类又可以分为两大类:

  1. 运行时异常: 就比如算数异常
  2. Checked异常: 非运行时异常

Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws

try:

执行可能产生 异常的代码

catch:

捕获异常

throw:

抛出异常 手动抛出异常

throws:

异常声明 声明可能要抛出的各种异常

finally:

无论是否发生异常,代码总能执行

异常对象常用的方法:catch小括号里的

方法

void printStackTrace()

输出异常的堆栈信息

String getMessage()

返回异常信息描述字符串,是printStackTrace()输出信息的一部分

常见的异常类型:

try-catch:

把可能出现异常的代码块放入try语句块中,使用catch语句捕获异常

try-catch捕获异常的三种情况:

1.正常:try语句块中的代码没有出现异常:那么catch语句块中的代码不会执行

2.出现异常:try语句块中的代码产生异常对象,并且异常类型匹配,进入catch然后继续执行代码

3.异常类型不匹配:try语句块中的代码产生异常对象,异常类型不匹配,程序中断

.printStackTrace()的堆栈跟踪功能显示出程序运行到当前类的执行流程 ?????

try-catch格式:

try里面放可能出现异常的语句

try{
    int c = aa/bb;

    System.out.println(c);

}catch (ArithmeticException e){
    System.out.println("被除数不能为0");

}

try-catch-finally:

finally:是否发生异常都执行

不执行的唯一情况,除非程序遇到 System.exit() 调用,这会导致 JVM 终止,finally 块不会被执行。

当try-catch-finally存在return语句时:
  1. 发生异常
  2. 异常类型匹配
  3. 进入catch,先执行return语句之前的代码
  4. 执行finally
  5. 执行return
public void method(){
         try {
               // 代码段 1
              // 产生异常的代码段 2
          } catch (异常类型 ex) {
              // 对异常进行处理的代码段
               return;
          }finally{
                // 代码段
          }
}

注意:

  1. try-catch-finally结构中try语句块是必须的,catch、finally语句块均可选,但两者至少出现之一
  2. try-catch块中存在return语句,是否还执行finally块? 执行,先执行fainlly块再return
  3. try-catch- finally块中, finally块唯一不执行的情况是什么?除非程序遇到 System.exit() 调用,JVM停止

throws声明某个方法可能抛出的各种异常,多个异常用逗号隔开,放在方法名旁边

方式1:调用者处理异常

方式2:调用者继续声明异常

main()方法声明的异常由Java虚拟机处理

throw:自定义异常类

public static int divide(int a, int b) throws DivisionByZeroException {
    if (b == 0) {
        // 抛出自定义异常
        throw new Exception("除数不能为零");
    }
    return a / b;
}

throw和throws的区别:

1.作用不同:

  • throw用于程序员自行产生并且抛出异常
  • throws用于声明该方法内抛出异常

2.使用的位置不同:

  • throw位于方法体内部
  • throws必须跟在方法参数列表后,不能单独使用

3.内容不同:

  • throw抛出一个异常对象

上面是throw,抛出一个实际的异常

下面是throws, 用于声明一个方法可能会抛出异常。它放在方法签名中,告知调用者这个方法可能会抛出的异常。

public class Main {
    public static void main(String[] args) {
        try {
            readFile("somefile.txt");
        } catch (IOException e) {
            System.out.println("Error reading file: " + e.getMessage());
        }
    }
    

    public static void readFile(String fileName) throws IOException {
      
        // 如果发生文件读取异常,抛出 IOException
        throw new IOException("File not found");
    }
}

异常链:

当你创建一个新的异常时,可以将原始异常作为参数传递给新异常。这样,原始异常会作为“原因”存储在新异常中。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值