Возникли проблемы с блоком Try-Catch в программе ввода-вывода Java - PullRequest
0 голосов
/ 14 ноября 2009

Я создал вывод для программы, которая позволяет пользователю вводить имя и номер своего сотрудника, а затем их почасовую заработную плату и их общее количество обычных и сверхурочных часов. Я впервые работаю с программой такого типа в java, и у меня возникла проблема с блоком Try-Catch, когда он получает текстовый ввод от пользователя, а затем устанавливает его. Если кто-нибудь может помочь мне, это будет очень ценно.

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class CreatePayrollFile extends JFrame implements ActionListener, WindowListener {
    public static final int WIDTH = 400;
    public static final int HEIGHT = 300;
    JPanel titlePanel = new JPanel();
    JPanel displayPanel = new JPanel(new GridLayout(6, 1));
    JPanel dPanel1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
    JPanel dPanel2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
    JPanel dPanel3 = new JPanel(new FlowLayout(FlowLayout.LEFT));
    JPanel dPanel4 = new JPanel(new FlowLayout(FlowLayout.LEFT));
    JPanel dPanel5 = new JPanel(new FlowLayout(FlowLayout.LEFT));
    JPanel dPanel6 = new JPanel(new FlowLayout(FlowLayout.LEFT));
    JPanel dPanel7 = new JPanel(new FlowLayout(FlowLayout.LEFT));
    JPanel buttonPanel = new JPanel();
    private JLabel companyName = new JLabel("Payroll INC.");
    Font bigFont = new Font("Helvetica", Font.ITALIC, 24);
    private JLabel prompt = new JLabel("Enter Payroll Information");
    private JTextField employeeName = new JTextField(10);
    private JTextField employeeNumber = new JTextField(10);
    private JTextField hourlyRate = new JTextField(10);
    private JTextField regularHours = new JTextField(10);
    private JTextField overtimeHours = new JTextField(10);
    private JLabel enameLabel = new JLabel("Employee Name       ");
    private JLabel enumLabel = new JLabel("Employee Number   ");
    private JLabel hrLabel = new JLabel("Hourly Rate                ");
    private JLabel rhLabel = new JLabel("Regular Hours          ");
    private JLabel orLabel = new JLabel("Overtime Hours        ");
    private JButton enterDataButton = new JButton("  Enter data  ");
    DataOutputStream ostream;

    public CreatePayrollFile() {
        super("Create Payroll File - Assignment 10");

        setSize(WIDTH, HEIGHT);
        try {
            ostream = new DataOutputStream(new FileOutputStream("payroll.dat"));
        } catch (IOException e) {
            System.err.println("File not opened");
            System.exit(1);
        }
        Container contentPane = getContentPane();
        contentPane.setLayout(new BorderLayout());

        companyName.setFont(bigFont);
        titlePanel.add(companyName);
        titlePanel.setBackground(Color.white);

        dPanel1.add(prompt);
        displayPanel.add(dPanel1);

        dPanel2.add(enameLabel);
        dPanel2.add(employeeName);
        displayPanel.add(dPanel2);

        dPanel3.add(enumLabel);
        dPanel3.add(employeeNumber);
        displayPanel.add(dPanel3);

        dPanel4.add(hrLabel);
        dPanel4.add(hourlyRate);
        displayPanel.add(dPanel4);

        dPanel5.add(rhLabel);
        dPanel5.add(regularHours);
        displayPanel.add(dPanel5);

        dPanel6.add(orLabel);
        dPanel6.add(overtimeHours);
        displayPanel.add(dPanel6);

        buttonPanel.setBackground(Color.white);
        buttonPanel.setLayout(new FlowLayout());
        enterDataButton.setMnemonic(KeyEvent.VK_E);
        buttonPanel.add(enterDataButton);
        enterDataButton.addActionListener(this);

        contentPane.add(titlePanel, BorderLayout.NORTH);
        contentPane.add(displayPanel, BorderLayout.CENTER);
        contentPane.add(buttonPanel, BorderLayout.SOUTH);
        addWindowListener(this);
    }

    private void writeRecord() {

        String employeeName;
        Double hourlyRate;
        Integer employeeNumber, regularHours, overtimeHours;


     // this is where I am having errors. It is saying that the getText method is undefined
     // for each respective use (int, string, double). I am also getting error "The method
     // writeString(String) is undefined for the type DataOutputStream" and the same 
     // undefined errors for the setText for each respective use. 

        try {
            employeeName = String.parseString(employeeName.getText());
            employeeNumber = Integer.parseInt(employeeNumber.getText());
            hourlyRate = Double.parseDouble(hourlyRate.getText());
            regularHours = Integer.parseInt(regularHours.getText());
            overtimeHours = Integer.parseInt(overtimeHours.getText());
            ostream.writeString(employeeName);
            ostream.writeInt(employeeNumber);
            ostream.writeDouble(hourlyRate);
            ostream.writeInt(regularHours);
            ostream.writeInt(overtimeHours);
            employeeName.setText("");
            employeeNumber.setText("");
            hourlyRate.setText("");
            regularHours.setText("");
            overtimeHours.setText("");

        } catch (NumberFormatException e2) {
            System.err.println("Invalid number ");
        } catch (IOException e3) {
            System.err.println("Error writing file");
            System.exit(1);
        }
    }

    public void actionPerformed(ActionEvent e) {
        writeRecord();
    }

    public void windowClosing(WindowEvent e) {
        try {
            ostream.close();
        } catch (IOException e4) {
            System.err.println("File not closed");
            System.exit(1);
        }

        System.exit(0);
    }

    public void windowClosed(WindowEvent e) {
    }

    public void windowDeiconified(WindowEvent e) {
    }

    public void windowIconified(WindowEvent e) {
    }

    public void windowOpened(WindowEvent e) {
    }

    public void windowActivated(WindowEvent e) {
    }

    public void windowDeactivated(WindowEvent e) {
    }

    public static void main(String[] args) {
        CreatePayrollFile cmof = new CreatePayrollFile();
        cmof.setVisible(true);
    }
} 

Поскольку на этом форуме я ранее "защелкивался" за публикацию запроса о помощи в выполнении домашних заданий, я заранее заявляю, что знаю, что это домашнее задание, но, как все видят, я не просто прошу людей сделать Это. Мне кажется, что говорить это риторически, но я не хочу, чтобы кто-то предполагал, что я не прилагаю усилий. Я приложил усилия и выполнил все в том виде, в котором преподавал преподаватель, но, должно быть, меня неправильно поняли, когда он прочитал ту часть лекции, в которой рассказывалось о методах набора и получения.

Заранее спасибо всем, кто оказывает помощь.


+++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++


Благодаря помощи различных форумов, программа теперь работает и создает выходной файл, который должен. Теперь мне нужно создать программу, которая читает в только что созданном файле. Я не помещал все это в первый пост, чтобы можно было разбить вещи на шаги (не могу прочитать в файле, если вы его не создали. Вроде как). Если мне нужно будет создать новую ветку, тогда я это сделаю, но, так как ppl были знакомы с программой, скорее всего, прочтет это, я разместил ее в той же ветке, что и правка.

Теперь мне нужно добавить еще одно поле внизу списка в графическом интерфейсе, которое отображает валовую оплату после ее расчета на основе входных данных, считанных из только что созданного файла.

Чтобы перефразировать это, первая программа должна была создать файл. Теперь мне нужно прочитать его и отобразить рассчитанную сумму брутто. (ссылка на изображение фотобакета примера вывода: [URL = "http://i108.photobucket.com/albums/n24/zypher89/readPayroll.jpg"] http://i108.photobucket.com/albums/n24/zypher89/readPayroll.jpg[/URL])

По какой-то причине сайт java.sun.com не работает (по крайней мере, я не могу получить к нему доступ даже с разных компьютеров в разных сетях), поэтому у меня его нет в качестве ссылки.

Вот мой код с закомментированными ошибками

[CODE]

пакетное задание 10_11;

import java.io. ; импорт java.awt. ; import java.awt.event. ; импорт javax.swing. ;

открытый класс ReadPayrollFile расширяет JFrame реализует ActionListener, WindowListener {

public static final int WIDTH = 400;
public static final int HEIGHT = 300;
JPanel titlePanel = new JPanel();
JPanel displayPanel = new JPanel(new GridLayout(7, 1));
JPanel dPanel1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel dPanel2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel dPanel3 = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel dPanel4 = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel dPanel5 = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel dPanel6 = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel dPanel7 = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel buttonPanel = new JPanel();
private JLabel companyName = new JLabel("Payroll INC.");
Font bigFont = new Font("Helvetica", Font.ITALIC, 24);
private JLabel prompt = new JLabel("Enter Payroll Information");
private JTextField employeeName = new JTextField(10);
private JTextField employeeNumber = new JTextField(10);
private JTextField hourlyRate = new JTextField(10);
private JTextField regularHours = new JTextField(10);
private JTextField overtimeHours = new JTextField(10);
private JTextField grossPay = new JTextField(10);
private JLabel enameLabel = new JLabel("Employee Name       ");
private JLabel enumLabel = new JLabel("Employee Number   ");
private JLabel hrLabel = new JLabel("Hourly Rate                ");
private JLabel rhLabel = new JLabel("Regular Hours          ");
private JLabel orLabel = new JLabel("Overtime Hours       ");
private JLabel gpLabel = new JLabel ("Gross Pay                 ");
private JButton nextRecordButton = new JButton("  Next Record  ");
DataInputStream fstream;

public ReadPayrollFile() {
    super("Read Payroll File - Assignment 11");

    setSize(WIDTH, HEIGHT);
    try
    {
        fstream = new DataInputStream(new FileInputStream("payroll.dat"));

    } catch (IOException e) {
        System.err.println("File not opened");
        System.exit(1);
    }
    Container contentPane = getContentPane();
    contentPane.setLayout(new BorderLayout());

    companyName.setFont(bigFont);
    titlePanel.add(companyName);
    titlePanel.setBackground(Color.white);

    dPanel1.add(prompt);
    displayPanel.add(dPanel1);

    dPanel2.add(enameLabel);
    dPanel2.add(employeeName);
    displayPanel.add(dPanel2);

    dPanel3.add(enumLabel);
    dPanel3.add(employeeNumber);
    displayPanel.add(dPanel3);

    dPanel4.add(hrLabel);
    dPanel4.add(hourlyRate);
    displayPanel.add(dPanel4);

    dPanel5.add(rhLabel);
    dPanel5.add(regularHours);
    displayPanel.add(dPanel5);

    dPanel6.add(orLabel);
    dPanel6.add(overtimeHours);
    displayPanel.add(dPanel6);

    dPanel7.add(gpLabel);
    dPanel7.add(grossPay);
    displayPanel.add(dPanel7);

    buttonPanel.setBackground(Color.white);
    buttonPanel.setLayout(new FlowLayout());
    nextRecordButton.setMnemonic(KeyEvent.VK_E);
    buttonPanel.add(nextRecordButton);
    nextRecordButton.addActionListener(this);

    contentPane.add(titlePanel, BorderLayout.NORTH);
    contentPane.add(displayPanel, BorderLayout.CENTER);
    contentPane.add(buttonPanel, BorderLayout.SOUTH);
    addWindowListener(this);
}

private void readRecord(DataInputStream inputFile) {

    String l_employeeName;
    Double l_hourlyRate;
    Integer l_employeeNumber, l_regularHours, l_overtimeHours;
    boolean endOfFile = false;

    try {

        while (!endOfFile)
        {
            try
            {
                /** This is where it says that the readChars() is undefined. The code posted
                 *  doesn't show it, but I have tried changing the output file program to 
                 *  write the string as a UTF and then changed this program to readUTF and it
                 *  works for "l_employeeName = inputFile.readChars();" but not for the 
                 *  "fstream.readChars(l_employeeName);". Also, all of the fstream lines have
                 *  errors "The method readInt() in the type DataInputStream is not applicable
                 *  for the arguments (Integer)" (replace Integer/Int with Double respectively).
                 */

                l_employeeName = inputFile.readUTF();
                l_employeeNumber = inputFile.readInt();
                l_hourlyRate = inputFile.readDouble();
                l_regularHours = inputFile.readInt();
                l_overtimeHours = inputFile.readInt();
                fstream.readUTF(l_employeeName);
                fstream.readInt(l_employeeNumber);
                fstream.readDouble(l_hourlyRate);
                fstream.readInt(l_regularHours);
                fstream.readInt(l_overtimeHours);

                calculateGrossPay(l_hourlyRate, l_regularHours, l_overtimeHours);

                employeeName.setText("l_employeeName");
                employeeNumber.setText("l_employeeNumber");
                hourlyRate.setText("l_hourlyRate");
                regularHours.setText("l_regularHours");
                overtimeHours.setText("l_overtimeHours");
                grossPay.setText("grossPayAmmount");
            } 

            catch (NumberFormatException e2) 
            {
                System.err.println("Invalid number ");
            }

            catch (IOException e3) 
            {
                System.err.println("Error reading file");
                System.exit(1);
            } //here I get error "Syntax error, insert "Finally" to complete TryStatement"
        }

        /** Then here I assume the instructor wants the program to
         *  read in the next set of employee data from the input file
         *   but he didn't specify and hasn't returned my email. So if 
         *   going with my assumption, how would I go about doing that?
         */
        public void actionPerformed(ActionEvent e) {
            NextRecord();
        }

        public void windowClosing(WindowEvent e) {
            try {
                fstream.close();
            } catch (IOException e4) {
                System.err.println("File not closed");
                System.exit(1);
            }

            System.exit(0);
        }

        public void windowClosed(WindowEvent e) {
        }

        public void windowDeiconified(WindowEvent e) {
        }

        public void windowIconified(WindowEvent e) {
        }

        public void windowOpened(WindowEvent e) {
        }

        public void windowActivated(WindowEvent e) {
        }

        public void windowDeactivated(WindowEvent e) {
        }

        public static void main(String[] args) {
            ReadPayrollFile cmof = new ReadPayrollFile();
            cmof.setVisible(true);
        }
        public double calculateGrossPay(double l_hourlyRate, int l_regularHours, int l_overtimeHours)
        {
            double grossPayAmmount, overtimePayRate, overtimePay;

            overtimePayRate = l_hourlyRate * 1.5;
            overtimePay = l_overtimeHours * overtimePayRate;
            grossPayAmmount = ((l_hourlyRate * l_regularHours) + overtimePay);

            return grossPayAmmount;
        }
    }

[/ CODE]

Я собираюсь продолжить работу над ним, изучать файловый ввод / вывод, а также пытаться заставить работать API.

Еще раз спасибо за помощь всем.

Ответы [ 4 ]

2 голосов
/ 14 ноября 2009

Вы допустили 3 основных ошибки

  1. Ваши локальные переменные в writeRecord() имеют то же имя, что и переменные экземпляра, и, следовательно, скрывают их. Уже указано решение Chip Uni +.
  2. Класс String не имеет функции parseString(String). Проверьте Javadoc ( JDK API: строка ). Просто удалите это полностью, так как getText() в любом случае возвращает String.
  3. DataOutputStream не имеет функции writeString() используйте writeChars() вместо
2 голосов
/ 14 ноября 2009

Для всех методов setText: у вас есть локальные переменные, которые переопределяют переменные класса. Попробуйте вместо этого:

private void writeRecord() {

    String l_employeeName;
    Double l_hourlyRate;
    Integer l_employeeNumber, l_regularHours, l_overtimeHours;


 // this is where I am having errors. It is saying that the getText method is undefined
 // for each respective use (int, string, double). I am also getting error "The method
 // writeString(String) is undefined for the type DataOutputStream" and the same 
 // undefined errors for the setText for each respective use. 

    try {
        l_employeeName = String.parseString(employeeName.getText());
        l_employeeNumber = Integer.parseInt(employeeNumber.getText());
        l_hourlyRate = Double.parseDouble(hourlyRate.getText());
        l_regularHours = Integer.parseInt(regularHours.getText());
        l_overtimeHours = Integer.parseInt(overtimeHours.getText());
        ostream.writeString(l_employeeName);
        ostream.writeInt(l_employeeNumber);
        ostream.writeDouble(l_hourlyRate);
        ostream.writeInt(l_regularHours);
        ostream.writeInt(l_overtimeHours);
        employeeName.setText("");
        employeeNumber.setText("");
        hourlyRate.setText("");
        regularHours.setText("");
        overtimeHours.setText("");

Для ostream.writeString: документация для DataOutputStream показывает, что ostream.writeString отсутствует Попробуйте использовать ostream.writeChars.

1 голос
/ 14 ноября 2009

Проблема в том, что вы хотите получить доступ к переменным-членам, но на самом деле получить доступ к локальным переменным. Имена локальных переменных фактически скрывают ваши переменные-члены! Если вы определите класс, как это

public class A {
  private int asdf = 0;

  public void blah() {
    String asdf = "Hello!";
    System.out.println(text);
  }

}

Программа выведет "Привет!" если ты называешь "бла". Это связано с тем, что локальная переменная «текст» скрывает элемент с тем же именем. У вас есть два варианта:

  1. Выберите разные имена, как это

    public class A {
      private int aNumber = 0;
    
      public void blah() {
        String asdf = "Hello!";
        System.out.println(aNumber);
      }
    
    }
    
  2. Используйте это для доступа к члену, как это

       public class A {
          private int asdf = 0;
    
          public void blah() {
            String asdf = "Hello!";
            System.out.println(this.asdf);
          }
    
        }
    
0 голосов
/ 14 ноября 2009

Посмотрите на Java API

С некоторыми исследованиями вы узнаете, почему

... метод getText не определен

в ваших строках.

Но я бы предложил вам использовать IDE даже для домашней работы.

...