这是我的代码:
import java.util.Scanner;
class codingActivity1{
public static void main(String[] args) {
System.out.println("Enter a number in base 8:");
Scanner n = new Scanner (System.in);
boolean flag;
String zz = n.nextLine();
int y = zz.length();
if (y < 0 || y > 7) {
System.out.println("ERROR: Incorrect Octal Format");
flag = false;
}
else {
flag = true;
}
for (int i = 0; i < y; i++) {
if (Integer.parseInt("" + zz.charAt(i)) > 8) {
System.out.println("ERROR: Incorrect Octal Format");
}
}
int result= Integer.parseInt(zz,8);
System.out.println(result);
}
}
我实际上所做的是将以8为底的基数转换为以10为底的基数。
但是,如果我输入“ 1287”,则会出现此错误
Exception in thread "main" java.lang.NumberFormatException: For input string: "1287" under radix 8
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)
at java.base/java.lang.Integer.parseInt(Integer.java:658)
at codingActivity1.main(codingActivity1.java:25)
我该如何解决?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
这个错误是因为你尝试将包含非法八进制数字的字符串转换为整数。在八进制系统中,有效的数字范围是0到7。当你输入"1287"时,字符'8'和'7'超出了八进制的有效范围,导致NumberFormatException
。
要解决这个问题,你需要在尝试转换之前,先验证输入字符串中的每个字符是否都是合法的八进制数字(即0-7)。你可以通过修改你的代码来实现这一点,增加一个检查每个字符的循环。这里是一个修改后的版本:
import java.util.Scanner;
class CodingActivity1 {
public static void main(String[] args) {
System.out.println("Enter a number in base 8:");
Scanner n = new Scanner(System.in);
String zz = n.nextLine();
int y = zz.length();
// 验证输入的每个字符是否为合法的八进制数字
boolean isValidOctal = true;
for (int i = 0; i < y; i++) {
char c = zz.charAt(i);
if (c < '0' || c > '7') {
isValidOctal = false;
break;
}
}
if (!isValidOctal) {
System.out.println("ERROR: Incorrect Octal Format");
} else {
try {
int result = Integer.parseInt(zz, 8);
System.out.println(result);
} catch (NumberFormatException e) {
// 这里理论上不会进入,因为我们已经提前验证了输入
System.err.println("Unexpected NumberFormatException occurred.");
}
}
}
}
在这个修改后的版本中,我添加了一个isValidOctal
标志,并在循环中检查每个字符是否落在八进制的有效范围内。如果发现任何非法字符,就立即设置isValidOctal
为false
并跳出循环。只有当输入完全验证为合法的八进制数字后,才尝试进行转换。这样可以避免抛出NumberFormatException
异常。