开发者

Having problem with Try-Catch block in a Java I/O program

开发者 https://www.devze.com 2022-12-11 05:10 出处:网络
I have created the output for a program that allows a user to input their employee name and number and then their hourly wage and their total number of regular hours and overtime hours. This is my fir

I have created the output for a program that allows a user to input their employee name and number and then their hourly wage and their total number of regular hours and overtime hours. This is my first time working with this type of program in java and I'm having an issue with the Try-Catch block where it gets the text input from the user and then sets it. If anyone can assist me it would be greatly appreciated.

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);
    }
} 

Because I have been "snapped" on before on this forum for posting homework assistance request, I'm stating in advance that I know this is homework, but as anyone can see, I'm not just asking for people to do it. I feel that having to say that is rhetorical, but I don't want anyone to assume that I'm not putting in effort. I have put effort in and completed everything in the form that the instructor taught but I must have misunderstood when he went over the part of the lecture covering the set and get methods.

Thanks in advance to all who provide assistance.


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


Thanks to the assistance from various forums, the program now works and creates the output file it is supposed to. Now I need to create a program that reads in the file that was just created. I didn't put it all in the first post to be able to break things down into steps (can't read in a file if you haven't created it. kinda thing). If I need to create a new thread then I will, but since ppl were familiar with the program would be likely to read this, I posted it in the same thread as an edit.

What I need to do now is to add another field to the bottom of the list in the GUI that displays the Gross Pay after it has been calculated based on the input read in from the file just created.

To re-word that, the 1st program was to create the file. Now I need to read it in and display the calculated gross pay. (link to photobucket image of example output: [URL="http://i108.photobucket.com/albums/n24/zypher89/readPayroll.jpg"]http://i108.photobucket.com/albums/n24/zypher89/readPayroll.jpg[/URL])

For some reason the java.sun.com site has been down (at least I can't access it even from different computers on different networks) so I don't have it as a reference.

Here is my code with errors commented out

[CODE]

package assignment10_11;

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

public class ReadPayrollFile 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(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]

I am going to continue working on it and studying file I/O as well as trying to get the API to work.

Thanks again for everyone's assistance.


For all of the setText methods: you have local variables that override the class variables. Try this instead:

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("");

For ostream.writeString: The documentation for DataOutputStream shows that there is no ostream.writeString. Try using ostream.writeChars .


You made 3 basic errors

  1. Your local variables in writeRecord() have the same name as the instance variables and thus are hiding them. Already indicated by Chip Uni + solution.
  2. The String class has no function parseString(String). Check the javadoc (JDK API: String). Just remove that completely as getText() anyway returns a String.
  3. DataOutputStream has no function writeString() use writeChars() instead


The problem is that you want to access the member variables but actually access the local variables. The names of the local variables actually hide your member variables! If you define a class like this

public class A {
  private int asdf = 0;

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

}

The program will print "Hello!" if you call "blah". This is because the local variable "text" hides the member of the same name. You have two options:

  1. Choose different names like this

    public class A {
      private int aNumber = 0;
    
      public void blah() {
        String asdf = "Hello!";
        System.out.println(aNumber);
      }
    
    }
    
  2. Use this to access the member like this

       public class A {
          private int asdf = 0;
    
          public void blah() {
            String asdf = "Hello!";
            System.out.println(this.asdf);
          }
    
        }
    


Have a look at the java api

With some research you will find out why

... getText method is undefined

on your Strings.

But I would suggest you to use a IDE, even for homework.

0

精彩评论

暂无评论...
验证码 换一张
取 消