问题
I am having trouble running the following code. Not sure if I am doing this right, but I am trying to have the main method read two files that I am passing to the method as arguments. So in the interactions pane, I am typing:
run Main(customer.dat, smartphone.dat)
If I try to do this, I get an error: invalid top level statement
I have attached the main method below. Where am I going awry? Even though the code compiles I have a feeling I am missing something with my readFile methods and/or calling the main function.
Thanks in advance -- I did look through SO for similar cases, however nothing came up. I apologize if this type of question has been posted before.
import java.util.*;
import java.io.*;
public class Main
{
private static ArrayList<Customer> customers = new ArrayList<Customer>(); // array-based list to store customers while reading file
private static ArrayList<Smartphone> smartphones = new ArrayList<Smartphone>(); // array-based list to store smartphones while reading file
private static MyPriorityQueueSmart[] sections = new MyPriorityQueueSmart[30]; // array of Queues to store sections of store with phones. 30 because max(model#%day = 30)
private static MyPriorityQueueCust line = new MyPriorityQueueCust(); // Queue to simulate line outside the store
private static void readFileCustomer(String file) // method to read customer.dat
{
try
{
FileReader input = new FileReader(file);
BufferedReader bufRead = new BufferedReader(input);
String line = "";
line = bufRead.readLine(); // parses first line
while(line != null)
{
String[] tokens = line.split("\\|"); // splits line by vertical bar
String name = tokens[0];
int patience = Integer.parseInt(tokens[1]);
int speed = Integer.parseInt(tokens[2]);
int strength = Integer.parseInt(tokens[3]);
int budget = Integer.parseInt(tokens[4]);
int PreferredModel = Integer.parseInt(tokens[5]);
Customer cust = new Customer(name, patience, speed, strength, budget, PreferredModel); // constructs customer
customers.add(cust); // stores customer in list
line = bufRead.readLine(); // parses next line
}
}
catch(IOException e) // error-checking
{
System.out.println("There was a problem reading the file");
System.exit(0);
}
}
private static void readFileSmartphone(String file) // method to read smartphone.dat
{
try
{
FileReader input = new FileReader(file);
BufferedReader bufRead = new BufferedReader(input);
String line = "";
line = bufRead.readLine(); // parses first line
while(line != null)
{
String[] tokens = line.split("\\|"); // splits line by vertical bar
int model = Integer.parseInt(tokens[0]);
int price = Integer.parseInt(tokens[1]);
Smartphone smart = new Smartphone(model, price); // constructs smartphone
smartphones.add(smart); // stores smartphone in list
line = bufRead.readLine(); // parses nextl ine
}
}
catch(IOException e) // error-checking
{
System.out.println("There was a problem reading the file");
System.exit(0);
}
}
public static void main(String[] args) // string[] args should be the customer file name followed by the smartphone file name
{
if(args.length!=2) // error-checking
{
System.out.println("Must provide an argument: 2 files names");
System.exit(0);
}
readFileCustomer(args[0]); // reads customer.dat
readFileSmartphone(args[1]); // reads smartphone.dat
Scanner scan = new Scanner(System.in); //
while(true)
{
System.out.println("1 -- Load Additional Customers");
System.out.println("2 -- Insert New Phone");
System.out.println("3 -- Display Customers");
System.out.println("4 -- Start Simulation");
System.out.println("5 -- Exit");
int choice = scan.nextInt();
if(choice == 1)
{
System.out.println("Enter the file name of the customer data: ");
String name = scan.next();
readFileCustomer(name);
}
else if(choice == 2)
{
System.out.println("Enter model# (100, 200, 300, 400): ");
int model = scan.nextInt();
System.out.println("Enter price of phone: ");
int price = scan.nextInt();
Smartphone smart = new Smartphone(model, price);
smartphones.add(smart);
}
else if(choice == 3)
{
for(Customer cust: customers)
{
System.out.println(cust.getName() + ", ");
}
}
else if(choice == 4)
{
// Start Simulation
System.out.println("Please enter the current day (#) of the month: "); // necessary for hashing
int dayOfMonth = scan.nextInt(); // reads user-input for current day of the month
if(dayOfMonth < 1 || dayOfMonth > 31) // error-checking
{
System.out.println("Invalid date. Please re-enter the current day (#) of the month: ");
dayOfMonth = scan.nextInt();
}
// Reorganize customers into PQ -- simulating the "line" outside the doors according to skills
for(Customer cust: customers) // iterates through array-based list of customers generated during file-reading
{
line.offer(cust); // builds the line of customers at the front of the store in order of ability
}
// Reorganize smartphones into PQ by type -- simulating the "most expensive" phones in order
for(Smartphone smart: smartphones)
{
int model = smart.getModel(); // store model of current phone in list
int hash = model % (dayOfMonth + 20); // generate hash tag
boolean confirmAdd = false; // required for recursion -- will turn to true if phone is added
while(confirmAdd = false)
{
if(sections[hash].isEmpty() == true || sections[hash].peek().getModel() == model) // check if hash index is empty or holds same model
{
sections[hash].offer(smart); // add the phone to the PQ @ the index
confirmAdd = true; // toggle to confirm the addition of the phone
}
else
hash = (hash + 1) % 30; // linear probing
}
}
// Customers leave line, go to section & buy most expensive phone if possible
while(line.isEmpty() == false) // makes sure there are people in the line
{
Customer firstInLine = (Customer)line.peek(); // locates first customer in line
int PreferredModel = firstInLine.getPreferredModel(); // stores preference of said customer
int hash = PreferredModel%(dayOfMonth+20); // generates hash tag to direct customer to correct section
if(sections[hash].isEmpty() == false) // makes sure the section has not sold out
{
if(firstInLine.getBudget() >= sections[hash].peek().getPrice()) // checks if phone is within budget of customer
{
Smartphone boughtPhone = (Smartphone)sections[hash].remove(); // customer buys phone and phone is removed from display
System.out.println(firstInLine.getName() + "has bought phone model# " + boughtPhone.getModel() + "at the price of " + boughtPhone.getPrice()); // prints results
}
else // phone is out of budget of customer
System.out.println(firstInLine.getName() + "cannot afford phone model# " + sections[hash].peek().getModel() + "at the price of " + sections [hash].peek().getPrice() + "and leaves the store"); // prints results
}
else
{
System.out.println(firstInLine.getName() + "is out of luck. The phone he or she wants is sold out");
}
line.remove(); // as the first person in line has entered the store, he leaves the line and the line moves up
}
} // recursive loop until the line is empty
else if(choice == 5)
{
System.exit(0);
}
else
{
System.out.println("Enter a number from 1 - 5");
}
}
}
}
回答1:
After quick searching around I assume you're using DrJava and its Interactions Pane.
You don't need those parentheses in the run command. Try run Main customer.dat smartphone.dat
instead.
That will run the main
method of class Main
with arguments customer.dat
and smartphone.dat
Source
回答2:
you cannot call the main method. the reason it is called the main method is because it calls the rest of the methods.but when you do not do a DOS based program main method is not compulsory unlike otherwise.
来源:https://stackoverflow.com/questions/8408710/java-error-invalid-top-level-statement