Я не могу понять, где я ошибаюсь в этом java задании. Требуется создавать объекты из текстового файла с помощью regrex, java Reflection и getContructor (). Как только объект создан, запускается поток. Я успешно создал объекты, жестко закодировав аргументы непосредственно в параметры, однако, когда я читаю строки из текстового файла с использованием регулярных выражений, объекты не будут создавать. Ниже приведен мой код, начинающийся с моего основного метода:
public static void main(String[] args) {
try {
String option = args[0];
String filename = args[1];
if ( !(option.equals("-f")) && !(option.equals("-d")) ) {
System.out.println("Invalid option");
printUsage();
}
GreenhouseControls gc = new GreenhouseControls();
if (option.equals("-f")) {
addEvent(new Restart(0,filename));
}
gc.run();
// Condition added for step 4.5, creates greenhouse.Restore object and deserializes object in restoreSystem method
if (option.equals("-d")) {
Restore restore = new Restore(filename);
restore.restoreSystem();
}
}
catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Invalid number of parameters");
printUsage();
}
}
}
Проблема существует в моем классе Restart, образец которого приведен ниже.
import tme4.*;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Restart extends Event {
String eventsFile;
public Restart(long delayTime, String filename) {
super(delayTime);
eventsFile = filename;
}
@Override
public void run() {
start();
System.out.println("Restarting system..");
String eventName; // member variable to hold String value specified in text file
long time; // member variable to hold type long value in text file
int rings = 0;
File f = new File(eventsFile);
// try and catch blocks added for exception purposes
try {
// Scanner Object created to read information in the file whose pathway is specified by variable f
Scanner sc = new Scanner(f);
// While loop to iterate through each line in text file
while (sc.hasNextLine()) {
// Patter and Matcher Objects created to evaluate each line in file based on regular expression
Pattern pat = Pattern.compile("Event=(?<eventName>[^,]+?),time=(?<time>[\\d]+)(,rings=(?<rings>[\\d]+))?");
Matcher mat = pat.matcher(sc.nextLine());
// While loop to implement Matcher.find() method assigning values to member variables based on
// patters found using regular expression provided through Pattern.compile() parameters
while (mat.find()) {
eventName = mat.group("eventName");
time = Long.parseLong(mat.group("time"));
// if statement to evaluate potential rings attribute for greenhouse.Bell event
if (mat.group("rings") != null) {
rings = Integer.parseInt(mat.group("rings"));
Bell.setRings(rings);
}
// create objects from text file then add to eventList
try {
Class<?> td = Class.forName(eventName);
Constructor<?> constructor = td.getConstructor(long.class);
Event event = (Event) constructor.newInstance(time);
Controller.addEvent(event);
} catch(ClassNotFoundException | NoSuchMethodException e){
System.err.println("Object not created..");
} catch (IllegalAccessException | InstantiationException | InvocationTargetException e) {
e.printStackTrace();
}
}
}// end of while
}// end of while
catch (IOException ex) {
ex.printStackTrace();
}
}
}
Обратите внимание, что используемое регулярное выражение работало в моем последнее задание, за исключением того, что мне не нужно было создавать объекты таким образом. Я просто использовал ключевое слово new в случае оператора switch. Я также включу свой класс контроллера и классы событий ниже ..
package tme4;
import java.io.Serializable;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public abstract class Controller implements Serializable{
// A class from java.util to hold Event objects:
public static List<Event> eventList = new ArrayList<>();
public static void addEvent(Event c) {
eventList.add(c);
}
public void run(){
ExecutorService exec = Executors.newCachedThreadPool();
if(eventList.size() == 1){
exec.submit(eventList.get(0));
eventList.remove(eventList.get(0));
} else {
for(Event e : eventList){
exec.submit(e);
}
}
exec.shutdown();
}
// abstract method created for implementation in GreenhouseControls
public abstract void shutdown();
}
import java.io.Serializable;
public abstract class Event implements Serializable,Runnable{
protected long delayTime;
public String eventName;
protected long eventTime;
private static volatile boolean suspend = false;
public Event(){}
public Event(long delayTime) {
this.delayTime = delayTime;
start();
}
public void start() { // Allows restarting
eventTime = System.currentTimeMillis() + delayTime;
}
public boolean ready() {
return System.currentTimeMillis() >= eventTime;
}
public synchronized void isSuspend() throws InterruptedException {
while(!suspend)
wait();
}
public synchronized void suspend(){
suspend = true;
notifyAll();
}
public synchronized void resume(){
suspend = false;
notifyAll();
}
// setters and getters to set and retrieve field values
public long getEventTime(){
return eventTime;
}
public void setEventTime(long etime){
this.eventTime = etime;
}
public long getDelayTime(){
return delayTime;
}
public void setDelayTime(long dTime){ this.delayTime = dTime; }
public void setEventName(String newEventName){
this.eventName = newEventName;
}
public String getEventName(){
return eventName;
}
@Override
public void run() {
try {
synchronized(this){
while(suspend){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Thread.sleep(eventTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.start();
}
}
И кусок одного из подклассов, расширяющих событие .. моя консоль выглядит так ...