Java-异常处理-处理RuntimeException(2/2)

本文介绍了如何在Java程序中处理整数除法运算时可能出现的ArithmeticException(除数为0)和InputMismatchException(输入非整数),通过try-catch语句捕获并给出相应的错误提示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面有一个简单的整数除法运算程序,输入两个整数作为被除数和除数,在正常情况下,会输出两数相除的整数商。

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int op1 = scanner.nextInt();
        int op2 = scanner.nextInt();
        System.out.println(op1+" / "+op2+" = "+op1/op2);
    }
}

在正常输入的情况下,运行结果如下图所示:

image.png

但是,当输入不正常时,程序将会抛出异常,比如:

1、输入的除数为0时;

2、没有按要求输入整数,而是输入字符时;

先尝试发现在上述两种输入情况下会抛出什么类型的异常;再修改上述程序,在main方法中引入异常处理,当出现上述两种异常输入情况时,都要给出错误信息提示,当:

1、输入的除数为0时,错误提示信息为:“除数不能为0”

2、没有按要求输入整数,而是输入字符时,错误提示信息为:“请输入两个整数”

输入格式:

在一行中输入两个整数相除。

输出格式:

输出相除的结果,如果发生异常,请输出异常信息。

输入样例:

在这里给出一组输入。例如:

12 4

输出样例:

在这里给出相应的输出。例如:

12 / 4 = 3

其他测试样例:

image.png

image.png

这一节,我们来看看RuntimeException:

 虽然Runtime异常是Exception的分支。显然,Exception类是受检异常。但是Java语言把RuntimeException视为一个特别分支。RuntimeException及其子类都是非受检异常。这种异常属于非受检异常,可以不抛,也可以不捕获。有时候不是因为懒,纯粹是不适合捕获。

但是,如果你愿意,我们也可以捕获?比如这道题,它要求捕获两种异常

那书接上回:

这异常的捕获是个怎么捕法?

捕获异常: 

try-catch子句理解

我们要学习一个try- catch语句

try就是尝试,catch就是抓住

try子句里面是可能产生异常的语句,catch子句就是抓住里面的异常——这就是捕获异常。

我们运行main类代码,发现它没有报错。

这道题的要求,也是让我们把原有的警告报错,换成输出语句

那我们先尝试除数为0的情况,输入

12 0

可以看到:我们触发了一个lang包下的名叫ArithmeticException的异常类。题目上要我们捕获;

try-catch代码我们直接端上来,在注释中体会它的写法

具体语法

try
{}
catch()//括号里是“异常类类型 e“,e是形参名
{}
 try {
           Scanner scanner = new Scanner(System.in);
           int op1 = scanner.nextInt();
           int op2 = scanner.nextInt();
           System.out.println(op1 + " / " + op2 + " = " + op1 / op2);
           }//可以看到Try子句里面是正常情况下完整的程序代码(也是含有可能产生异常的代码),我们使用try,意味着试试这个方法
       catch(ArithmeticException e)//我们捕获一个ArithmeticException异常类
       {
           System.out.println("除数不能为0");//{ }是对这个异常的应对,本题要求我们输出相应语句
       }

 我们再次输入 12 0

结果如期。

下一个异常的产生,需要我们先输入

c 6

 我们这次触发了一个util包下的InputMismatchException异常类,这次不是lang包了。我们需要亲自导包:import java.util.InputMismatchException;

 在try-catch子句里面,再添加一个捕获种类。(catch子句可以多个,构成try-catch-catch-...)

理解try是尝试,catch是抓异常的意思,就理解一段代码里面异常各种各种,我们catch也可以多写几个。

catch (InputMismatchException e)
       {
           System.out.println("请输入两个整数");
       }

这次又再次输入

a 7

try-catch的使用时间

相比声明抛出,try-catch是更加主动应对异常的方式。

那什么时候使用声明抛出,什么时候又使用try-catch子句呢?

通常来说,需要我们自定义的异常。比如上一章我们写的输入异常,以及小明的身体异常这样的。这种异常,希望我们对其作出合理纠正的异常,来完成本来程序的需求。-——往往设计成受检异常,即checked异常一般继承Exception,再使用try-catch子句

Error

Java其实还有另外一种Unchecked异常,叫做Error。它是指那些不可纠正或者不值得纠正的异常。这跟普通异常有明显区别,因为普通异常,是可以纠正的。比如:我们设计一个小丑表演的程序,小丑不熟练,表演无法进行。我们写个受检异常,并选择try-catch,在catch子句里让小丑多训练。但如果小丑生病请假了,那表演就无法进行了,这就是错误。

最常见的错误就是Java虚拟机错误:VirtualMachineError.包括我们熟知的StackOverflowError,往往是函数递归导致栈帧溢出,也有OutMemoryError,比如循环创建大数组,导致堆区内存不足。这种错误,我们选择直接在代码上删除或者改变代码,而不是去声明抛出,或者捕获。所以把它归为Unchecked异常。

所以关于UncheckedException

真正准确的说法就是包括:Error和运行时异常。

对于能够合理纠正的异常,我们采用Exception,特别是自己定义的类

对于纠正起来没有意义或者也不正确,不合逻辑的异常,我们让它继承RunException。

Error就别继承了,这怎么也算得上是bug了,得改(狗头)。

本题的完整代码:



import java.util.InputMismatchException;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {

       try {
           Scanner scanner = new Scanner(System.in);
           int op1 = scanner.nextInt();
           int op2 = scanner.nextInt();
           System.out.println(op1 + " / " + op2 + " = " + op1 / op2);
           }//可以看到Try子句里面是正常情况下完整的程序代码(也是含有可能产生异常的代码),我们使用try,意味着试试这个方法
       catch(ArithmeticException e)//我们捕获一个ArithmeticException异常类
       {
           System.out.println("除数不能为0");//{ }是对这个异常的应对,本题要求我们输出相应语句
       }
       catch (InputMismatchException e)
       {
           System.out.println("请输入两个整数");
       }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值