-1

为什么我的 petArray 为空?myArray 数组很好,但不知道为什么 petArray 为空

这是我的 .txt 文件:

112|C|Fluffy|4/1/2011|Tabby|Gray|M|Y|N|N
332|D|Phydeaux|6/3/2009|Collie|White/Tan|M|N|N|N
237|C|Snagglepuss|5/13/2010|Siamese|Sable|M|Y|Y|N
165|C|Sylvester|1/12/2008|Tuxedo|Black/White|F|N|N|N
113|C|Fluffy|499/1/2011|Tabby|Gray|M|Y|N|N
333|X|Phydeaux|6/3/2009|Collie|White/Tan|M|N|N|N
238|C|Snagglepuss|5/13/2010|Siamese|Sable|M|Y|Y|N
166|C|Sylvester|1/12/2008|Tuxedo|Black/White|F|N|G|N
114|C|Fluffy|4/1/2011|Tabby|Gray|M|Y|N|N
334|D|12/4/2005|Phydeaux|Collie|White/Tan|M|N|N|N
239|C|Snagglepuss|5/13/2010|Siamese|Sable|M|Y|Y|N
167|P|Sylvester|1/12/2008|Tuxedo|Black/White|F|N|E|N
115|C|Fluffy|4/1/2011|Tabby|Gray|M|Y|
335|D|Phydeaux|6/3/2009|Collie|White/Tan|M|N|N|N
240|C|Snagglepuss|5/13/2010|Siamese|Sable|M|Y|Y|N
168|C|Sylvester|1/12/20085|Tuxedo|Black/White|F|N|N|N

PetGUI.java:

import java.awt.BorderLayout;
import java.awt.Component;
import java.util.*;
import java.awt.TextArea;
import java.util.LinkedList;
import javax.swing.*;

import javax.swing.JFrame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/*
* Makes a new JFrame thats makes two textareas, fills in the textareas
*  from the array and linkedlist.
*/
public class PetGUI extends JFrame{
static int number;
static String[] animalArray;
static TextArea north;
static TextArea south;
public PetGUI(TextFileInput tfi){

    int lines = 0;
    TextFileInput tfil = new TextFileInput("project4.txt");
    String rlines = tfil.readLine();
    while(rlines != null){
        lines++;
        rlines = tfil.readLine();
    }
    tfil.close();

    String [] myArray = new String[100];
    number = lines;
    animalArray = myArray;
    this.setSize(400,400);
    this.setLocation(200, 200);
    this.setTitle("Adoptable Pets");
    createFileMenu();
    createEditMenu();

    TextArea north = new TextArea(9,20);
    TextArea south = new TextArea(9,20);
    this.getContentPane().add(north,BorderLayout.NORTH);

    this.getContentPane().add(south,BorderLayout.SOUTH);
    north.setEditable(false);
    south.setEditable(false);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);

    Cat c;
    Dogs d;


    AdoptablePet [] petArray = new AdoptablePet[lines];
    for(int i = 0; i < lines; i++){
        myArray[i] = tfi.readLine();;
    }
    tfi.close();

    for(int i = 0; i < lines; i++){
        if(myArray[i].charAt(4) == 'C'){
            String[] r = myArray[i].split("\\|");
            if(r.length != 9){
            try{

                    throw new IllegalPetInput("Not the right length of input");
            }
            catch(IllegalPetInput a){

            }
            }
            else
                try{
                c = new Cat(Integer.parseInt(r[0]),r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],Boolean.parseBoolean(r[9]));
                petArray[i] = c;
                }
                catch(AdoptablePetException a){
                    System.out.println("Wrong information for the cat.");
                }
        }

        if(myArray[i].charAt(4) == 'D'){
            String[] r = myArray[i].split("\\|");
            if(r.length != 9){
            try{

                    throw new IllegalPetInput("Not the right length of input");
            }
            catch(IllegalPetInput a){

            }
            }
            else
                try{
                d = new Dogs(Integer.parseInt(r[0]),r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],Boolean.parseBoolean(r[9]));
                petArray[i] = d;

                }
            catch(AdoptablePetException a){
                System.out.println("Wrong information for the cat.");
            }
        }
    }


    LinkedList l = new LinkedList();




    for(int i = 0; i < lines; i++)
        System.out.println(myArray[i]);
    System.out.println();
    for(int i = 0; i < lines; i++)
        System.out.println(petArray[i]);





  //Appends the north side of the texarea with all of the lines    
for(int i = 0; i < l.size(); i++)
    north.append((String) l.get(i));


}
4

3 回答 3

2

我在您的数据中计算了 10 个字段,您的检查说应该只有 9 个,然后抛出一个异常,该异常被捕获并丢弃。

if(r.length != 9)
{
     try
     {
          throw new IllegalPetInput("Not the right length of input");
     }
     catch(IllegalPetInput a)
     {
         // you're throwing this away!  bad form!
     }
 }

稍后,您将查看 10 个字段的数据!

c = new Cat(Integer.parseInt(r[0]),r[1],r[2],r[3],
    r[4],r[5],r[6],r[7],r[8], 
    Boolean.parseBoolean(r[9])); // field number 10!

在计算行数后,您还关闭了输入流:

TextFileInput tfil = new TextFileInput("project4.txt");
String rlines = tfil.readLine();
while(rlines != null){
    lines++;
    rlines = tfil.readLine();
}
tfil.close();  // stream closed!  any reads after this should hypothetically have failed!

你永远不会重新打开它,所以没有其他任何东西可以工作。

摆脱数组并使用 ArrayList,不要一次读取文件以查看您将提前拥有多少行。

于 2012-12-11T01:07:21.083 回答
0

我怀疑问题是,您已经阅读了文件以计算行数。再次将它们存储在数组中,您正在阅读它们。但是当您读取行数时,光标已经在文件末尾。现在,当您这次读取字符串时,readline()返回 null,这可能是您的数组为 null 的原因。

于 2012-12-11T01:09:55.393 回答
0

因为 r.length 总是 10 而不是 9,就像你的 if 语句条件一样。你说

if(r.length != 9){
            try{

                    throw new IllegalPetInput("Not the right length of input");
            }
            catch(IllegalPetInput a){

            }

这样如果语句的计算结果为真,就会抛出异常,然后立即捕获(你为什么这样做?)

于 2012-12-11T01:10:58.300 回答