2015-01-05 3 views
1

Следующий код должен прочитать список студентов и их оценки из файла, сравнить их друг с другом, то показать студент самого высокого среднегоКак справляться с исключениями из араристов?

public class CSDept implements Comparable{ 
private String studentName; 
private double java; 
private double dataStructure; 
private double algorithms; 
private int numStudents; 


public CSDept(){ 

} 

public CSDept(String studentName,double java,double dataStructure,double algorithms){ 
    this.studentName=studentName; 
    this.java=java; 
    this.dataStructure=dataStructure; 
    this.algorithms=algorithms; 
} 

public String getStudentName() { 
    return studentName; 
} 

public void setStudentName(String studentName) { 
    this.studentName = studentName; 
} 

public String getJava() { 
    return java+" "; 
} 

public void setJava(double java) { 
    this.java = java; 
} 

public String getDataStructure() { 
    return dataStructure+" "; 
} 

public void setDataStructure(double dataStructure) { 
    this.dataStructure = dataStructure; 
} 

public String getAlgorithms() { 
    return algorithms+" "; 
} 

public void setAlgorithms(double algorithms) { 
    this.algorithms = algorithms; 
} 


public int getNumStudents() { 
    return numStudents; 
} 

public double getAvg(){ 
    return (java+algorithms+dataStructure)/3; 
} 



public int compareTo(Object student) { 
    if(this.getAvg()>((CSDept)student).getAvg()) return 1; 
    if (this.getAvg()<((CSDept)student).getAvg()) return -1; 
    return 0; 
} 

public String toString(){ 
    return studentName+":\n"+"\t"+"Java: "+java+"\t"+"Data Structure : "+dataStructure+"\t"+"Algorithms: "+algorithms+"\n"; 
}} 

    import java.awt.*; 
    import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 
    import java.io.*; 
    import java.util.*; 

    import javax.swing.*; 
    import javax.swing.border.TitledBorder; 


public class CSDeptFrame extends JFrame{ 
private JPanel pnlInput=new JPanel(new GridLayout(4,2)); 
private JPanel pnlOutput=new JPanel(new BorderLayout()); 
private JPanel pnlFinal=new JPanel(new GridLayout(1,2)); 

private TitledBorder brdInput=new TitledBorder("Marks"); 
private TitledBorder brdOutput=new TitledBorder("First Student"); 

private JLabel lblName=new JLabel("Student Name"); 
private JLabel lblJava=new JLabel("Java"); 
private JLabel lblDataStructure=new JLabel("Data Structure"); 
private JLabel lblAlgorithm=new JLabel("Algorithm"); 
static JLabel lblFirst=new JLabel("The First Student is :"); 

static JTextField txtName=new JTextField(20); 
static JTextField txtJava=new JTextField(20); 
static JTextField txtDataStructure=new JTextField(20); 
static JTextField txtAlgorithm=new JTextField(20); 

static JButton btnFirst=new JButton("Who is The First Student?"); 

public CSDeptFrame(String title){ 
    super(title); 
    pnlInput.setBorder(brdInput); 
    pnlInput.add(lblName); 
    pnlInput.add(txtName); 
    pnlInput.add(lblJava); 
    pnlInput.add(txtJava); 
    pnlInput.add(lblDataStructure); 
    pnlInput.add(txtDataStructure); 
    pnlInput.add(lblAlgorithm); 
    pnlInput.add(txtAlgorithm); 

    pnlOutput.setBorder(brdOutput); 
    pnlOutput.add(btnFirst,BorderLayout.NORTH); 
    pnlOutput.add(lblFirst,BorderLayout.SOUTH); 

    pnlFinal.add(pnlInput); 
    pnlFinal.add(pnlOutput); 

    setLayout(new BorderLayout()); 
    add(pnlFinal);} 

public static void main(String[] args){ 
    CSDeptFrame frame=new CSDeptFrame("CS DEPT"); 
    frame.setSize(450,200); 
    frame.setResizable(false); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 

    final ArrayList<CSDept> cS= new ArrayList(); 
    File readFile =new File("read.txt"); 
    final File writeFile=new File("write.txt"); 


    try { 
     Scanner scan=new Scanner(readFile); 
     while(scan.hasNext()){ 
      CSDept student=new CSDept(); 
      student.setStudentName(scan.next()); 
      student.setJava(scan.nextDouble()); 
      student.setDataStructure(scan.nextDouble()); 
      student.setAlgorithms(scan.nextDouble()); 
      cS.add(student); 


     } 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     JOptionPane.showMessageDialog(null, "OPS! File is not found"); 
     } 

    btnFirst.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      CSDept firstStudent=new CSDept(); 
      firstStudent.setStudentName(cS.get(0).getStudentName()); 
      firstStudent.setJava(Double.parseDouble(cS.get(0).getJava())); 
      firstStudent.setDataStructure(Double.parseDouble(cS.get(0).getDataStructure())); 
      firstStudent.setAlgorithms(Double.parseDouble(cS.get(0).getAlgorithms())); 

      for (int i=0;i<cS.size();i++){ 
       if (cS.get(i).compareTo(cS.get(i+1))==-1){ 
        firstStudent=cS.get(i+1); 
       } 
      } 
      txtName.setText(firstStudent.getStudentName()); 
      txtJava.setText(firstStudent.getJava()); 
      txtDataStructure.setText(firstStudent.getDataStructure()); 
      txtAlgorithm.setText(firstStudent.getAlgorithms()); 
      lblFirst.setText("The First Student is: "+ txtName.getText()); 
      PrintWriter out; 
      try { 
       out = new PrintWriter(new BufferedWriter(new FileWriter(writeFile,true))); 
       for (CSDept cs: cS){ 

        out.println(cs.toString()); 
        out.print("The first student is " + firstStudent.toString()); 
       } 
       out.close(); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
       JOptionPane.showMessageDialog(null, "OPS! File in Not Found"); 
      } 

     } 
    }); 

}} 

Но проблема в том, что следующие утверждениях не добавить какие-либо объекты для арраиста, в чем проблема?

try { 
     Scanner scan=new Scanner(readFile); 
     while(scan.hasNext()){ 
      CSDept student=new CSDept(); 
      student.setStudentName(scan.next()); 
      student.setJava(scan.nextDouble()); 
      student.setDataStructure(scan.nextDouble()); 
      student.setAlgorithms(scan.nextDouble()); 
      cS.add(student); 


     } 
+2

Список 'cS' пуст, поэтому в индексе нет элемента. –

+0

Вы можете избежать этого, используя итератор или расширенный цикл' for', а не 'List # get (int index)' для перемещения по списку , –

+1

cS.get (0) приведет к выходу за пределы. У вас есть список, но он пуст. –

ответ

2

Вы проблема заключается в том, что вы пытаетесь получить элемент по заданному индексу из пустого списка:

final ArrayList<CSDept> cS= new ArrayList(); 

// ... 

public void actionPerformed(ActionEvent e) { 
    // ... 
    firstStudent.setStudentName(cS.get(0).getStudentName()); // ArrayList cS is empty here 
    // ... 

Может быть, вы могли бы добавить проверку, чтобы убедиться, что список не пуст перед обращением к элементам:

public void actionPerformed(ActionEvent e) { 
    if(!cS.isEmpty()) { 
     // do stuff 
    } 

Причиной, побуждающей ваш список пуст может быть то, что вы читаете пустой файл «read.txt» так что ваш while условия цикла никогда не true

Scanner scan=new Scanner(readFile); // this text file is probably empty 
while(scan.hasNext()){    // which makes this condition always false so loop is never executed 
    CSDept student=new CSDept(); 
    student.setStudentName(scan.next()); 
    student.setJava(scan.nextDouble()); 
    student.setDataStructure(scan.nextDouble()); 
    student.setAlgorithms(scan.nextDouble()); 
    cS.add(student); 
} 

Кроме того, у вас есть ArrayIndexOutOfBoundsException рисков в for петли внутри actionPerformed(). Вы сравниваете текущий элемент со следующим элементом, который будет после того, как i соответствует индексу последнего элемента, дать AIOBE в операторе сравнения с элементом с индексом i + 1:

for (int i=0;i<cS.size();i++){ 
    if (cS.get(i).compareTo(cS.get(i+1))==-1){ // once i = cS.size() - 1, you will get an AIOBE here 
     firstStudent=cS.get(i+1); 
    } 
} 

Вы можете это исправить, запустив цикл на i = 1 и сравнивая его с элементом i - 1 или используйте цикл forEach, который является более чистым способом достижения этого, поскольку он не включает индексированный доступ.

+0

Мой файл не пуст, что-то не так с кодом самого? –

+0

Когда вы читаете файлы, проверяйте каждую возможную ошибку: файл не найден, пуст, плохой формат, ... После этого проверьте содержимое сканера и если содержимое успешно загружено. –

+0

Вы поставили точку останова внутри 'while 'цикл выше и проверить, если цикл когда-либо введен? – nem035

Смежные вопросы