Java 边界数组和数字格式异常

Java 边界数组和数字格式异常,java,arrays,exception,Java,Arrays,Exception,我在使用tokensplit方法和parse int时遇到了这两个异常。 当我在代码中有printline语句时,使用ArrayOutofBounds,当我注释掉printline语句时使用另一个 public class MyArtistNodes { public ArrayList<ArtistNode> myArtistNodes = null; public MyArtistNodes(String filename) { Scanner input;

我在使用tokensplit方法和parse int时遇到了这两个异常。 当我在代码中有printline语句时,使用ArrayOutofBounds,当我注释掉printline语句时使用另一个

public class MyArtistNodes {

public ArrayList<ArtistNode> myArtistNodes = null;

public MyArtistNodes(String filename) {
       Scanner input;


       try {
           input = new Scanner(new File(filename));
           myArtistNodes = new ArrayList<ArtistNode>();
           while(input != null && input.hasNext()) {

               String line = input.nextLine();
               String[] tokens = line.trim().split("@");
               tokens = line.split(" ");
              // System.out.println(tokens.length+" "+tokens[1]+" -- "+Integer.parseInt(tokens[0].trim()));
               ArtistNode newA = new ArtistNode(tokens[1],Integer.parseInt(tokens[0].trim()));
               myArtistNodes.add(newA);
           }
           input.close();

       } catch (NumberFormatException | FileNotFoundException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }
   }
公共类MyArtistNodes{
公共ArrayList myArtistNodes=null;
公共MyArtistNodes(字符串文件名){
扫描仪输入;
试一试{
输入=新扫描仪(新文件(文件名));
myArtistNodes=newArrayList();
while(input!=null&&input.hasNext()){
String line=input.nextLine();
String[]tokens=line.trim().split(“@”);
标记=行分割(“”);
//System.out.println(tokens.length+“”+tokens[1]+“--”+Integer.parseInt(tokens[0].trim());
ArtistNode newA=新的ArtistNode(令牌[1],Integer.parseInt(令牌[0].trim());
添加(newA);
}
input.close();
}catch(NumberFormatException | FileNotFoundException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
错误:

     Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1

     at MyArtistNodes.<init>(MyArtistNodes.java:27)

     at Exam3Step3A.<init>(Exam3Step3A.java:6)

     at Exam3.main(Exam3.java:6)
线程“main”java.lang.ArrayIndexOutOfBoundsException中的异常:1 在MyArtistNodes。(MyArtistNodes.java:27) 在Exam3Step3A。(Exam3Step3A.java:6) 位于Exam3.main(Exam3.java:6)
错误编号格式异常可能是因为这一行:

       ArtistNode newA = new ArtistNode(tokens[1],Integer.parseInt(tokens[0].trim()));
ArtistNode newA = new ArtistNode(tokens[1],Integer.parseInt(tokens[0].trim()));
正如您所看到的,您正在尝试从字符串(标记[0])生成一个整数,因此,您的标记[0]有时不能是有效的数字,这就是您得到该例外的原因

ArrayIndexOutOfBoundsException

这可能是因为您试图在不存在的位置读取数组,而问题应该在同一行:

   ArtistNode newA = new ArtistNode(tokens[1],Integer.parseInt(tokens[0].trim()));
也许你的

  String[] tokens = line.trim().split("@");
               tokens = line.split(" ");
split并不适用于所有情况


希望对您有所帮助。您的输入格式为(
String
int
),…,但您将它们解析为('int',String'),…,基本上是这一行:

       ArtistNode newA = new ArtistNode(tokens[1],Integer.parseInt(tokens[0].trim()));
ArtistNode newA = new ArtistNode(tokens[1],Integer.parseInt(tokens[0].trim()));
应该是这样的:

ArtistNode newA = new ArtistNode(tokens[0],Integer.parseInt(tokens[1].trim()));

您是否尝试过调试或搜索这些错误?这些通常是需要解决的两个最直接的异常。是的,我没有,没有任何真正起作用的
ArrayIndexOutOfBoundsException:1
表示您试图访问索引
1
中的元素,但数组的长度不够。这意味着您的数组包含只有一个元素(在索引
0
)。我在您的代码中看到的唯一数组是
标记
,请确保它包含您期望的
@
。列表中没有@,我在网上发现,如果字符串不包含
@
,则必须初始化标记。数组将只有一个元素,您将无法访问
标记[1]
。是否要创建一个带有空字符串的
ArtistNode
,还是忽略该大小写?我必须将文件读入列表,然后读取该文件以颠倒列表顺序写入另一个文件。该文件确实包含如下项:1 Acconci(\n)2 BatteWell您使用的令牌=line.split(“”);因此,您将使用E空格和整数拆分此1 Acconci(\n)2。parseInt(标记[0].trim())将是正确的,但您确定此文件始终使用withes拆分吗?如果您得到一行,则会发生什么:1Acconci(\n)2,请参见?现在您的程序将尝试此整数。parseInt(“1Acconci”)你会得到错误,但输入文件已经用制表符分隔了,所以情况不应该是这样我告诉过你的,小心点,为什么不使用正则表达式?;)示例1 Acconci 2 Budd 3 Carpenter 4 Dill 5 Edwards如果输入不包含那个符号,你为什么要拆分在联机时,但它不能很好地工作。简单地说,它不是这样工作的。您使用
String.split()
的值初始化变量。我已经尝试过了,它会给我数组越界异常:1