Perhaps my title is not very clear, but I try to understand this problem.
Problem: I have many assignments and different persons solve them using their own way. They may need input from user process it and do what they want, I want to individually run their solutions as well as in a framework which run all solutions in one go. Below is the overall simplistic approach I designed as a framework.
But as this code straight showing me that I will get NoSuchElementException
(using Scanner
) StreamClosed
(using BufferedReader
) approach.
How can I achieve this or am I thinking very wrong or missing any core concepts?
I don't want a scanner
in main and pass its instance to all my code,( is this the only approach I can solve it)
public class AssignmentRunner {
public static void main(String[] args) {
AssignmentRunner runner = new AssignmentRunner();
AssignmentExecutor executor = new AssignmentExecutor();
executor.execute();
}
}
public interface Assignment {
void execute();
}
class AssignmentExecutor {
public List<Assignment> assignmentList ;
private void addAssignments(){
assignmentList = new ArrayList<Assignment>();
assignmentList.add(new Assignment1());
assignmentList.add(new Assignment2());
}
public void execute() {
addAssignments();
for (Assignment assigment : assignmentList) {
assigment.execute();
}
}
}
public class Assignment1 implements Assignment {
String inputString;
@Override
public void execute() {
input();
System.out.println(inputString);
}
private void input() {
Scanner scanner = new Scanner(System.in);
try {
inputString = scanner.nextLine();
}
catch (Exception e) {
System.err.println(e.getMessage());
}
finally {
scanner.close();
}
}
}
public class Assignment2 implements Assignment {
String inputString;
@Override
public void execute() {
input();
System.out.println("Hello"+inputString);
}
private void input() {
Scanner scanner = new Scanner(System.in);
try {
inputString = scanner.nextLine();
}
catch (Exception e) {
System.err.println(e.getMessage());
}
finally {
scanner.close();
}
}
}
EDIT: As per some comments and one answer I have made few modifications,kindly help me to understand is this the only best thing we can do or any other way to design my need.
NEED Different students can have different assignments for example (some may need input,others may not need any input)
- simply print hello world
- input string and show word count
- input number show factorial
- input number print its table
We want to execute each assignment class individually as well as from one Runner class as shown above.
MODIFICATION I did these modifications to all classes, showing sample for understanding what I did.
class AssignmentExecutor {
public List<Assignment> assignmentList ;
private void addAssignments(){
assignmentList = new ArrayList<Assignment>();
assignmentList.add(new Assignment1());
assignmentList.add(new Assignment2());
}
public void execute() {
Scanner scanner = new Scanner(System.in);
addAssignments();
for (Assignment assigment : assignmentList) {
assigment.execute(scanner);
}
scanner.close();
}
}
public class Assignment1 implements Assignment {
String inputString;
public static void main(String args[]) {
Assignment1 assignment1 =new Assignment1();
Scanner scanner = new Scanner(System.in);
assignment1.execute(scanner);
scanner.close();
}
@Override
public void execute(scanner) {
input(scanner);
System.out.println(inputString);
}
private void input(scanner) {
scanner = new Scanner(System.in);
try {
inputString = scanner.nextLine();
}
catch (Exception e) {
System.err.println(e.getMessage());
}
}
}