我正在尝试编写一个程序,在输入数字时输出数字的名称。它适用于一位数字,但我遇到了障碍。每当我输入一个大于10的数字时,它就会给我一个ArrayOutOfBoundsException。我不太清楚为什么,因为我没有太长时间使用数组。到目前为止,我只编写了代码,用于输出最多20个数字的名称。这是代码:
package numericname;
import java.util.Scanner;
public class NumericName {
static String[] Ones = {"Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten"};
static String[] Mids = {"Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"};
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int x;
System.out.println("Enter a number");
x = in.nextInt();
if(x/10 <= 1)
ones(x);
if(x/10 > 1 && x/10 < 2)
mids(x);
}
public static void ones(int x) {
System.out.println(Ones[x]);
}
public static void mids(int x) {
x -= 11
System.out.println(Mids[x]);
}
}
我添加了x - 11以使数字在字符串数组中与其名称相同,但它仍然不起作用。我究竟做错了什么?谢谢!
答案 0 :(得分:1)
两个问题,都与您是整数部门的受害者有关:
在Java中,当您除以两个整数时,结果是具有十进制截断的等式的值。这意味着小数部分是“截止”。例如:11 / 10 = 1
,19 / 10 = 1
,9 / 10 = 0
现在出现问题:
解决这个问题:
将其更改为if (x <= 10)
要解决此问题,请将其更改为:
if(x < 20)
if(x / 10 == 1)
答案 1 :(得分:0)
您的代码正在检查是否(x / 10 <= 1),那么10s将为真,并在这种情况下放入代码中。即11/10 == 1
答案 2 :(得分:0)
我想这里有两个问题:
你为什么要尝试使用多个阵列,你可以选择这两个阵列。其次,为什么使用x / 10,你可以简单地比较x&lt; 10或x&gt; 10&amp;&amp; X - 小于20。
答案 3 :(得分:0)
我对main()的建议编辑如下:
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int x;
System.out.println("Enter a number");
x = in.nextInt();
if(x <= 10) {
ones(x);
} else if(x < 20) {
mids(x);
}
}
答案 4 :(得分:0)
问题在于你正在尝试的除法是整数除法,这不会像你期望的那样工作。从11到19的任何数字都将x / 10作为1,然后是函数
ones(x)
将导致ArrayIndexOutOfBounds
答案 5 :(得分:0)
这是因为x/10
仍然给你1
。它是一个整数除法。你必须将它改为浮点。
只需将x/10
和x/20
更改为x/10.0
和x/20.0
。
或者只是在分割期间将x
投射到float
。
示例强>
if((float)x/10 <= 1)
ones(x);
if((float)x/10 > 1 && (float)x/10 < 2)
mids(x);