我已经用Java进行了一些培训,我想制作一个关于3x5矩阵中的随机数的局部程序,其中与其他列相比,一列中的每个数字可能属于不同的打数。
我会做一个更好的解释:
一行中可以有9和11,但不能有11和13,因为它们属于同一打(11-20)。知道Tombola游戏的人会理解它。
但是使用cmd编译和执行后的主要错误是下面的错误,线程main java.lang中的异常。
所以我希望您能为我提供帮助:毕竟我是一名新的Java程序员。
线程“主”中的异常java.lang.IndexOutOfBoundsException:索引 长度为0的0个边界 在java.base / jdk.internal.util.Preconditions.outOfBounds(未知来源) 在java.base / jdk.internal.util.Preconditions.outOfBoundsCheckIndex(未知 资源) 在java.base / jdk.internal.util.Preconditions.checkIndex(未知源) 在java.base / java.util.Objects.checkIndex(未知源) 在java.base / java.util.ArrayList.remove(未知源) 在Sheet。(Sheet.java:20) 在Sheet.main(Sheet.java:35)
import java.util.*;
import java.math.*;
class Sheet{
private int[][] tab;
public Sheet(){
int [][] tab=new int [3][5];
List<Integer> list=new ArrayList<Integer>();
for(int l=10; l<=90; l+=10){
list.add(l);
}
Random rand=new Random();
for(int m=0; m<3; m++){
for (int n=0; n<5; n++){
tab[m][n]=rand.nextInt(90);
int o=(int)tab[m][m];
if(list.contains(o*10)){
break;
}
else{
list.remove(0*10);
n--;
}
}
}
}
public void printSheet(){
for (int i = 0; i <3; i++) {
for (int j = 0; j < 5; j++) {
System.out.println(tab[i][j] + " ");
}
System.out.println();
}
}
public static void main(String args[]){
Sheet c=new Sheet();
c.printSheet();
}
}
答案 0 :(得分:0)
您remove
的{{1}}号码比以前的list
要多。
加法器循环
add
以l = 10,20,30,40,50,60,70,80,90运行,因此恰好是9次。
删除循环对
for(int l=10; l<=90; l+=10){
list.add(l);
}
对于启动程序运行3 * 5 = 15次,因此很容易删除15个元素,由于for(int m=0; m<3; m++){
for (int n=0; n<5; n++){
tab[m][n]=rand.nextInt(90);
int o=(int)tab[m][m];
if(list.contains(o*10)){
break;
}
else{
list.remove(0*10);
n--;
}
}
}
,它有可能多次运行到n--
调用中。因此,您似乎从正好包含9个元素的列表中删除了随机且可能大量的元素。
(请注意,remove
不会从列表中删除remove(x)
,但是第x个元素(在这种情况下始终是第一个元素-适用于前9次尝试,然后是{{1} }为空,没有第一个元素,就会引发您看到的异常)
答案 1 :(得分:0)
导致异常的原因是行
list.remove(0*10);
要检查,您可以像下面这样注释并运行
//list.remove(0*10);