我是靠谱客的博主 开放纸鹤,最近开发中收集的这篇文章主要介绍异常记录NO.1(ArithmeticException、InputMismatchException、IllegalStateException、NoSuchElementException),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

异常记录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)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部