下面有一个简单的整数除法运算程序,输入两个整数作为被除数和除数,在正常情况下,会输出两数相除的整数商。
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);
}
}
在正常输入的情况下,运行结果如下图所示:
但是,当输入不正常时,程序将会抛出异常,比如:
1、输入的除数为0时;
2、没有按要求输入整数,而是输入字符时;
先尝试发现在上述两种输入情况下会抛出什么类型的异常;再修改上述程序,在main方法中引入异常处理,当出现上述两种异常输入情况时,都要给出错误信息提示,当:
1、输入的除数为0时,错误提示信息为:“除数不能为0”
2、没有按要求输入整数,而是输入字符时,错误提示信息为:“请输入两个整数”
输入格式:
在一行中输入两个整数相除。
输出格式:
输出相除的结果,如果发生异常,请输出异常信息。
输入样例:
在这里给出一组输入。例如:
12 4
输出样例:
在这里给出相应的输出。例如:
12 / 4 = 3
其他测试样例:
这一节,我们来看看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("请输入两个整数");
}
}
}