概述
异常记录NO.1
2021/3/17 周三
异常记录:
java.lang.ArithmeticException算术异常
java.util.InputMismatchException输入类型不匹配异常
java.lang.IllegalStateException无效状态异常
java.util.NoSuchElementException未找到元素异常
如有错误,欢迎在评论区指出,非常感谢!
在学完流程控制语句后,有一道练习题:输入一个正整数,输出这是一个几位数。
这篇博客记录写代码过程中遇到的几个错误。
1. java.lang.ArithmeticException算术异常
一开始我的思路是用这个正整数num,循环依次除以变量i为10、100、1000…的时候,用每次循环ct加1来记录,直到i大于num就停止,代码如下:
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while(true) {
int num = scan.nextInt();
int ct = 1;
for(int i = 10; i<=num; i*=10) {
if(num/i >= 1) {
ct++;
System.out.println(i + "," + ct ); // 输出每一步的除数i和位数记录ct
}
}
System.out.println(num + "是" + ct + "位数");
}
}
用大部分正整数测试了,都能正确求出是几位数,直到我想试一下int的最大值2147483647,按理说结果应该是10位数,本来认为在i=1000000000,ct=10的时候就应该停止了,但是程序却继续下去并报错了:
10,2
100,3
1000,4
10000,5
100000,6
1000000,7
10000000,8
100000000,9
1000000000,10 // 按理说这里就应该停止了
1410065408,11
1215752192,12
1316134912,13
276447232,14
1874919424,15
1569325056,16
1661992960,17
1241513984,18
268435456,19
1073741824,20
Exception in thread "main" java.lang.ArithmeticException: / by zero
at review.ErrorTest.main(Error.java:14)
ArithmeticException表示算术异常,由这个报错可以看出是由于除数为0导致的。
后来经过尝试发现,因为我的循环结束条件是i<=num,当i=1000000000时仍然是小于num的;
但int的最大值是10位,1000000000*10的结果不可能是10000000000,这有11位了,因此会缺掉一些二进制位,导致计算出来的结果为1410065408;
一直进行不准确的运算,直到i=1073741824时,i*10得到的结果为-2147483648,虽然不符合num/i >= 1,但循环没有停止,i继续乘10得到结果为0,这次循环将把0作为除数,于是就报错了。
2. java.util.InputMismatchException输入类型不匹配异常
由于上种思路在10位数以上运算时,即使不报错也可能不准确,所以最好是用另一种思路,循环拿这个正整数num自己去除以10:
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while(true) {
int num = scan.nextInt();
int ct = 1;
for(int i = num; i>0; i/=10) {
if(i/10 >= 1) {
ct++;
}
}
System.out.println(num + "是" + ct + "位数");
}
}
这样的话,只要在int范围内的正整数,都可以正确求出是几位数.
然后我又想试试大于int的数会报什么错:
Exception in thread "main" java.util.InputMismatchException: For input string: "2147483648"
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at review.ErrorTest.main(ErrorTest.java:10)
InputMismatchException表示输入类型不匹配异常
因为输入的已经不是int类型了,看 For input string: “2147483648” 可知接受成了String类型。同样直接输入数字之外的内容也会报这个错。
3. java.lang.IllegalStateException无效状态异常
另外,因为Scanner扫描仪一直没有关,想加一个scan.close();,由于我用的是while(true)无限循环,加到while循环外面的话,编译器直接报错这行代码不会运行到,如果加到while循环里面:
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while(true) {
int num = scan.nextInt();
int ct = 1;
for(int i = num; i>0; i/=10) {
if(i/10 >= 1) {
ct++;
}
}
System.out.println(num + "是" + ct + "位数");
scan.close();
}
}
编译器不报错,由于扫描仪运行一次之后已经关闭了,第二次循环还要用到scan.nextInt();方法,此时出现异常:
12345
12345是5位数
Exception in thread "main" java.lang.IllegalStateException: Scanner closed
at java.util.Scanner.ensureOpen(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at review.ErrorTest.main(ErrorTest.java:10)
IllegalStateException表示无效状态异常,在这个报错里指出了原因是Scanner closed扫描仪已关闭,这真是很白痴的一个错…
在后续还会有其他情况的无效状态异常,这里先不多说了(因为我也还没遇到…)
4. java.util.NoSuchElementException未找到元素异常
既然如此,那我把new Scanner放到循环里面,每一次循环都自己new完自己close是否可行呢?
public static void main(String[] args) {
while(true) {
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
int ct = 1;
for(int i = num; i>0; i/=10) {
if(i/10 >= 1) {
ct++;
}
}
System.out.println(num + "是" + ct + "位数");
scan.close();
}
}
结果还是同样第二次循环时报错,但这次的异常不同:
12345
12345是5位数
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at review.ErrorTest.main(ErrorTest.java:10)
NoSuchElementException表示未找到元素异常
百度了原因,说第一个循环中的scan对象关闭的时候,会把System.in也关闭了,即使第二次循环时又new了一个scan,但输入流已经关闭了。具体关于Scanner类原码里相关的解释如下:
https://zhidao.baidu.com/question/1702552526475622660.html
所以最好在确定不再使用系统的时候,再将流关闭。
在这个小练习中也不用判断要不要继续输入,所以就不关了吧,就让它一直报警告。
最后
以上就是开放纸鹤为你收集整理的异常记录NO.1(ArithmeticException、InputMismatchException、IllegalStateException、NoSuchElementException)的全部内容,希望文章能够帮你解决异常记录NO.1(ArithmeticException、InputMismatchException、IllegalStateException、NoSuchElementException)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复