BE Computer Engineering (Pokhara University) Advanced Programming with Java (PU, CMP 228) Question Paper 2079 Nepal
This is the official BE Computer Engineering (Pokhara University) Advanced Programming with Java (PU, CMP 228) question paper for 2079, as set in the regular annual examination. It carries 100 full marks and a time allowance of 180 minutes, across 12 questions. On Kekkei you can attempt this Advanced Programming with Java (PU, CMP 228) past paper online with a timer, get instant AI feedback and step-by-step solutions, and track the topics where you lose marks — completely free. Whether you are revising for your BE Computer Engineering (Pokhara University) Advanced Programming with Java (PU, CMP 228) exam or solving previous years' question papers, this 2079 paper is a great way to practise under real exam conditions.
Section A: Long Answer Questions
Attempt all / any as specified.
(a) Explain the four fundamental principles of Object-Oriented Programming (encapsulation, inheritance, polymorphism and abstraction) and discuss how each is supported by features of the Java language. (7)
(b) Distinguish between method overloading and method overriding in Java with suitable code examples. Explain the role of the super and this keywords and the use of the final modifier when applied to a method and a class. (8)
(a) Four Principles of OOP and their Java support (7 marks)
1. Encapsulation — Bundling data (fields) and the methods that operate on them inside a single unit (a class) and hiding the internal state.
- Java support:
private/protectedaccess modifiers hide fields; public getter/setter methods control access.
class Account {
private double balance; // hidden state
public double getBalance() { return balance; }
public void deposit(double a) { if (a > 0) balance += a; }
}
2. Inheritance — A class (subclass) acquires the fields and methods of another class (superclass), enabling code reuse and an is-a relationship.
- Java support: the
extendskeyword for classes andimplementsfor interfaces; all classes implicitly extendObject.
class SavingsAccount extends Account { double interestRate; }
3. Polymorphism — "Many forms": the same method call behaves differently depending on the object type.
- Java support: compile-time polymorphism via method overloading, and run-time polymorphism via method overriding with dynamic dispatch through a superclass reference.
4. Abstraction — Exposing only essential features while hiding implementation detail.
- Java support:
abstractclasses and methods, andinterfacetypes that declare what a class does without how.
(b) Overloading vs Overriding, super/this, final (8 marks)
| Feature | Method Overloading | Method Overriding |
|---|---|---|
| Definition | Same method name, different parameter list in same class | Subclass redefines a superclass method with the same signature |
| Binding | Compile-time (static) | Run-time (dynamic) |
| Inheritance | Not required | Required (subclass–superclass) |
| Return type | Can differ | Same or covariant |
class Calc { // OVERLOADING
int add(int a, int b) { return a + b; }
double add(double a, double b) { return a + b; }
}
class Animal { void sound() { System.out.println("Generic"); } }
class Dog extends Animal { // OVERRIDING
@Override void sound() { System.out.println("Bark"); }
}
this keyword — refers to the current object; used to disambiguate fields from parameters (this.x = x), to call another constructor (this(...)), or to pass the current object.
super keyword — refers to the immediate superclass; used to call the superclass constructor super(...), or to invoke an overridden superclass method super.sound().
final modifier:
- On a method — the method cannot be overridden by any subclass.
- On a class — the class cannot be subclassed (e.g.
Stringisfinal). - (On a variable it makes it a constant.)
(a) Describe the life cycle of a thread in Java with a neat labelled state-transition diagram, explaining the transitions between the new, runnable, running, blocked/waiting and dead states. (6)
(b) What is meant by thread synchronization? Write a complete multithreaded Java program that implements the classic producer–consumer problem using wait() and notify() on a shared bounded buffer, and explain how your solution avoids race conditions. (9)
(a) Thread Life Cycle in Java (6 marks)
A Java thread passes through the following states (managed by the JVM scheduler):
new Thread() start() scheduler picks
┌─────────┐ ───────► ┌──────────┐ ─────────────► ┌─────────┐
│ NEW │ │ RUNNABLE │ ◄───────────── │ RUNNING │
└─────────┘ └──────────┘ yield/preempt └─────────┘
▲ │
notify()/ │ sleep()/wait()/ │ run() ends
I/O ready/ │ blocked on lock/join ▼
timeout │ ┌─────────┐
┌─────────────────┐ │ DEAD │
│ BLOCKED/WAITING │ │(TERMIN.)│
└─────────────────┘ └─────────┘
- New — the
Threadobject is created butstart()has not yet been called. - Runnable — after
start(); the thread is ready and waiting for CPU from the scheduler. - Running — the scheduler has selected the thread and
run()is executing. - Blocked / Waiting / Timed-waiting — temporarily inactive, e.g. waiting for a lock, calling
wait(),sleep(ms), orjoin(). It returns to runnable when the condition is satisfied (notify(), lock acquired, timeout, I/O complete). - Dead / Terminated —
run()has finished or the thread was aborted; it cannot be restarted.
(b) Thread Synchronization & Producer–Consumer (9 marks)
Thread synchronization is the mechanism that ensures only one thread accesses a shared resource (critical section) at a time, preventing race conditions and inconsistent data. In Java it is achieved with the synchronized keyword (intrinsic locks/monitors) and inter-thread coordination via wait(), notify() and notifyAll().
import java.util.LinkedList;
import java.util.Queue;
class BoundedBuffer {
private final Queue<Integer> buf = new LinkedList<>();
private final int capacity = 5;
public synchronized void produce(int value) throws InterruptedException {
while (buf.size() == capacity) // wait while full
wait();
buf.add(value);
System.out.println("Produced: " + value);
notifyAll(); // wake consumers
}
public synchronized int consume() throws InterruptedException {
while (buf.isEmpty()) // wait while empty
wait();
int value = buf.poll();
System.out.println("Consumed: " + value);
notifyAll(); // wake producers
return value;
}
}
public class ProducerConsumer {
public static void main(String[] args) {
BoundedBuffer b = new BoundedBuffer();
Thread producer = new Thread(() -> {
try { for (int i = 1; i <= 10; i++) b.produce(i); }
catch (InterruptedException e) { Thread.currentThread().interrupt(); }
});
Thread consumer = new Thread(() -> {
try { for (int i = 1; i <= 10; i++) b.consume(); }
catch (InterruptedException e) { Thread.currentThread().interrupt(); }
});
producer.start();
consumer.start();
}
}
How race conditions are avoided:
produce()andconsume()aresynchronizedon the same buffer object, so only one thread holds the monitor at a time — no concurrent modification ofbuf.wait()is called inside awhileloop (notif) so a thread re-checks the condition after waking, guarding against spurious wake-ups.wait()releases the lock while sleeping, letting the partner thread proceed;notifyAll()wakes waiting threads when the buffer state changes, preventing deadlock and lost updates.
(a) List and explain the four types of JDBC drivers, stating one advantage and one disadvantage of each. (6)
(b) Write a complete Java program that connects to a MySQL database, retrieves all records from an Employee(empId, name, salary) table using a PreparedStatement, and prints them. Clearly identify the standard steps of JDBC connectivity used in your program and explain the difference between Statement and PreparedStatement. (8)
(a) Four Types of JDBC Drivers (6 marks)
Type 1 — JDBC-ODBC Bridge Driver
- Translates JDBC calls into ODBC calls.
- Advantage: easy to use, connects to any database with an ODBC source.
- Disadvantage: slow (extra translation layer), platform-dependent, requires ODBC installed; removed in JDK 8.
Type 2 — Native-API (Partly Java) Driver
- Converts JDBC calls into the database vendor's native client API.
- Advantage: faster than Type 1.
- Disadvantage: native client library must be installed on each machine; not fully portable.
Type 3 — Network-Protocol (Middleware) Driver
- Pure Java; sends JDBC calls to a middleware server that talks to the database.
- Advantage: no client-side library, can connect to many databases through one driver.
- Disadvantage: needs an extra middleware/application server tier.
Type 4 — Thin (Pure Java) Driver
- Pure Java; converts JDBC calls directly into the database's network protocol.
- Advantage: fully portable, fastest, no client software needed (most widely used, e.g. MySQL Connector/J).
- Disadvantage: database-specific (a different driver is needed per database vendor).
(b) JDBC Program with PreparedStatement (8 marks)
import java.sql.*;
public class EmployeeList {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/company";
String user = "root", pass = "password";
String sql = "SELECT empId, name, salary FROM Employee";
// Step 1: Load driver (optional since JDBC 4.0 auto-loads)
// Step 2: Establish connection (try-with-resources auto-closes)
try (Connection con = DriverManager.getConnection(url, user, pass);
PreparedStatement ps = con.prepareStatement(sql); // Step 3
ResultSet rs = ps.executeQuery()) { // Step 4
System.out.printf("%-6s %-15s %-10s%n", "ID", "Name", "Salary");
while (rs.next()) { // Step 5: process
System.out.printf("%-6d %-15s %-10.2f%n",
rs.getInt("empId"), rs.getString("name"), rs.getDouble("salary"));
}
} catch (SQLException e) { // Step 6: close is automatic
e.printStackTrace();
}
}
}
Standard JDBC steps: (1) load/register the driver, (2) establish a Connection via DriverManager, (3) create a Statement/PreparedStatement, (4) execute the query to obtain a ResultSet, (5) iterate and process the results, (6) close the resources (here handled automatically by try-with-resources).
Statement vs PreparedStatement:
Statement | PreparedStatement |
|---|---|
| SQL compiled on every execution | SQL precompiled once, reused with parameters |
| Built by string concatenation — prone to SQL injection | Uses ? placeholders set by setXxx() — safe from injection |
| Slower for repeated queries | Faster for repeated execution |
| Cannot handle binary/parameterised input cleanly | Handles parameters and types cleanly |
(a) Explain the Java event delegation model. Describe the roles of the event source, event object and event listener with reference to handling a button click in Swing. (5)
(b) Design and write a Swing-based GUI application for a simple login form containing two text fields (username and password) and a Login button. When the button is clicked, the program should display a message dialog indicating whether the entered credentials match a hard-coded valid pair. Use an appropriate layout manager. (7)
(a) Java Event Delegation Model (5 marks)
In the delegation event model an event generated by a source is delegated to (handled by) one or more registered listener objects, rather than the source handling it itself. Three participants:
- Event Source — the GUI component that generates the event (e.g. a
JButton). It maintains a list of registered listeners and fires events to them viaaddXxxListener(). - Event Object — an object (e.g.
ActionEvent) that encapsulates information about what happened (source, command, timestamp). It is passed to the listener method. - Event Listener — an object implementing a listener interface (e.g.
ActionListener) whose callback method (actionPerformed(ActionEvent e)) contains the response code.
Flow for a button click: user clicks the JButton (source) → an ActionEvent (event object) is created → the JVM invokes actionPerformed() on every registered ActionListener → the listener executes the handling logic.
(b) Swing Login Form (7 marks)
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class LoginForm extends JFrame {
private final JTextField userField = new JTextField(15);
private final JPasswordField passField = new JPasswordField(15);
public LoginForm() {
setTitle("Login");
setLayout(new GridLayout(3, 2, 5, 5)); // layout manager
add(new JLabel("Username:")); add(userField);
add(new JLabel("Password:")); add(passField);
JButton loginBtn = new JButton("Login");
add(new JLabel()); add(loginBtn);
loginBtn.addActionListener(new ActionListener() { // register listener
public void actionPerformed(ActionEvent e) {
String u = userField.getText();
String p = new String(passField.getPassword());
if (u.equals("admin") && p.equals("1234")) // hard-coded valid pair
JOptionPane.showMessageDialog(LoginForm.this, "Login Successful!");
else
JOptionPane.showMessageDialog(LoginForm.this, "Invalid Credentials!",
"Error", JOptionPane.ERROR_MESSAGE);
}
});
setSize(300, 150);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(LoginForm::new);
}
}
Here the JButton is the event source, the ActionListener is the listener registered with addActionListener, and ActionEvent e is the event object; the GridLayout arranges the labels, fields and button in a neat 3×2 grid.
Section B: Short Answer Questions
Attempt all / any as specified.
Differentiate between checked and unchecked exceptions in Java. Explain the use of the try, catch, finally, throw and throws constructs, and write a short program that defines and throws a user-defined (custom) exception.
Checked vs Unchecked Exceptions
| Checked Exception | Unchecked Exception |
|---|---|
Subclass of Exception (not RuntimeException) | Subclass of RuntimeException (and Error) |
| Checked at compile time | Checked at run time |
Must be handled with try-catch or declared with throws | No compulsory handling |
e.g. IOException, SQLException, ClassNotFoundException | e.g. NullPointerException, ArrayIndexOutOfBoundsException, ArithmeticException |
Exception-handling constructs
try— encloses the code that may throw an exception.catch— handles a specific exception type thrown from thetryblock.finally— always executes (whether or not an exception occurs), used for cleanup such as closing files/connections.throw— explicitly throws an exception object:throw new XxxException(...).throws— declares in a method signature the checked exceptions the method may propagate to its caller.
Custom Exception Program
class InvalidAgeException extends Exception { // user-defined checked exception
public InvalidAgeException(String msg) { super(msg); }
}
public class CustomExceptionDemo {
static void validate(int age) throws InvalidAgeException {
if (age < 18)
throw new InvalidAgeException("Age " + age + " is below 18 — not eligible");
System.out.println("Eligible to vote");
}
public static void main(String[] args) {
try {
validate(15);
} catch (InvalidAgeException e) {
System.out.println("Caught: " + e.getMessage());
} finally {
System.out.println("Validation complete");
}
}
}
Output: Caught: Age 15 is below 18 — not eligible then Validation complete.
Describe the Java Collections Framework hierarchy. Compare ArrayList vs LinkedList and HashMap vs TreeMap in terms of internal structure and performance. Write a short code snippet that uses an Iterator to traverse a generic List<String>.
Java Collections Framework Hierarchy
The framework is rooted at the Iterable → Collection interface, which branches into:
Iterable
│
Collection ───────────────┐
┌──────┼───────┐ (Map is separate)
List Set Queue Map
(Array (Hash (Linked (HashMap, TreeMap,
List, Set, List, LinkedHashMap,
Linked TreeSet) PriorityQ) Hashtable)
List, Linked
Vector) HashSet)
- List — ordered, allows duplicates, index-based.
- Set — no duplicates.
- Queue — FIFO/priority ordering.
- Map — key→value pairs (does not extend
Collection).
ArrayList vs LinkedList
ArrayList | LinkedList | |
|---|---|---|
| Internal structure | Dynamic array | Doubly-linked list |
Random access get(i) | ||
| Insert/delete at middle | (shifting) | once positioned |
| Best for | Frequent access/read | Frequent insertion/deletion |
HashMap vs TreeMap
HashMap | TreeMap | |
|---|---|---|
| Internal structure | Hash table (buckets) | Red-black (self-balancing) tree |
| Ordering | No order | Sorted by key (natural/comparator) |
| get/put complexity | average | |
| Null keys | One null key allowed | No null key |
Iterator over a generic List
List<String> names = new ArrayList<>(List.of("Asha", "Bibek", "Chandra"));
Iterator<String> it = names.iterator();
while (it.hasNext()) {
String name = it.next();
System.out.println(name);
}
Explain the difference between TCP and UDP communication in Java. Write a simple TCP client–server program (server and client code) in which the server echoes back any message sent by the client, using the ServerSocket and Socket classes.
TCP vs UDP in Java
TCP (Socket, ServerSocket) | UDP (DatagramSocket, DatagramPacket) |
|---|---|
| Connection-oriented | Connectionless |
| Reliable — guarantees delivery and order, with acknowledgements/retransmission | Unreliable — no delivery or order guarantee |
| Stream-based (continuous byte stream) | Packet (datagram) based |
| Higher overhead, slower | Lightweight, faster |
| Use: HTTP, file transfer, login/echo | Use: video/voice streaming, DNS, online games |
TCP Echo Server and Client
Server (EchoServer.java):
import java.io.*;
import java.net.*;
public class EchoServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(5000);
System.out.println("Server listening on port 5000...");
Socket client = server.accept(); // wait for client
BufferedReader in = new BufferedReader(
new InputStreamReader(client.getInputStream()));
PrintWriter out = new PrintWriter(client.getOutputStream(), true);
String msg;
while ((msg = in.readLine()) != null) {
System.out.println("Received: " + msg);
out.println("Echo: " + msg); // echo back
}
client.close();
server.close();
}
}
Client (EchoClient.java):
import java.io.*;
import java.net.*;
public class EchoClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 5000);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
BufferedReader console = new BufferedReader(
new InputStreamReader(System.in));
String line;
while ((line = console.readLine()) != null) {
out.println(line); // send to server
System.out.println("Server says: " + in.readLine());
}
socket.close();
}
}
The server creates a ServerSocket and blocks on accept(); the client creates a Socket to connect; messages flow over the input/output streams and the server echoes each line back.
Explain the life cycle of a servlet, describing the purpose of the init(), service() and destroy() methods. How does a servlet differ from a JSP page, and at what point is a JSP converted into a servlet?
Servlet Life Cycle
A servlet is managed by the servlet container (web server) through three life-cycle methods:
init(ServletConfig config)— Called once, when the servlet is first loaded/instantiated. Used for one-time setup such as opening database connections or reading configuration.service(ServletRequest req, ServletResponse res)— Called for every client request. The container creates a new thread per request and dispatches todoGet(),doPost(), etc. This is where the request is processed and the response generated.destroy()— Called once, before the servlet is unloaded/the container shuts down. Used to release resources (close connections, save state).
Load → init() [once] → service() [per request, many times] → destroy() [once] → unload
Servlet vs JSP
| Servlet | JSP |
|---|---|
Pure Java code; HTML is embedded inside out.println() statements | HTML page with embedded Java (scriptlets/tags) |
| Better for request processing / business logic (controller) | Better for presentation / view |
| Harder to write/maintain HTML | Easier for page design by non-programmers |
When a JSP becomes a servlet: at the first request (or at deployment if pre-compiled), the container's JSP engine translates the .jsp file into an equivalent Java servlet source file, then compiles it into a .class. This compiled servlet then follows the normal servlet life cycle (init → service → destroy). Thus a JSP is ultimately a servlet in disguise.
Differentiate between the String, StringBuffer and StringBuilder classes in Java with respect to mutability and thread safety. Explain why String is said to be immutable and what is meant by the string constant pool.
String vs StringBuffer vs StringBuilder
String | StringBuffer | StringBuilder | |
|---|---|---|---|
| Mutability | Immutable | Mutable | Mutable |
| Thread safety | Thread-safe (immutable) | Synchronized (thread-safe) | Not synchronized (not thread-safe) |
| Performance | Slow for many edits (creates new objects) | Slower than StringBuilder (locking overhead) | Fastest for single-thread editing |
| Use case | Fixed/constant text | Concatenation in multithreaded code | Concatenation in single-threaded code (Java 5+) |
Why String is immutable
Once a String object is created, its character contents cannot be changed; any "modifying" method (e.g. concat, replace) returns a new String object. Reasons for immutability:
- Security — strings are used for file paths, URLs, DB credentials; immutability prevents tampering.
- String pool sharing — multiple references can safely share the same literal.
- Thread safety — immutable objects need no synchronization.
- Hashcode caching — safe to cache the hashcode, making
Stringefficient as aHashMapkey.
String Constant Pool
The string constant pool is a special region of the heap where the JVM stores unique string literals. When a literal like "hello" is created, the JVM checks the pool; if it already exists, the same reference is reused instead of creating a new object — saving memory.
String a = "hello";
String b = "hello"; // refers to the SAME pooled object
System.out.println(a == b); // true
String c = new String("hello"); // new object on heap (not pooled)
System.out.println(a == c); // false
Compare the two ways of creating a thread in Java: extending the Thread class versus implementing the Runnable interface. State which approach is generally preferred and justify your answer with an example signature.
Creating a Thread: Thread class vs Runnable interface
1. Extending the Thread class
class MyThread extends Thread {
public void run() { System.out.println("Running via Thread"); }
}
// usage: new MyThread().start();
2. Implementing the Runnable interface
class MyTask implements Runnable {
public void run() { System.out.println("Running via Runnable"); }
}
// usage: new Thread(new MyTask()).start();
Extending Thread | Implementing Runnable |
|---|---|
| Subclass IS a thread | Task is separate from the thread |
| Uses up the single inheritance slot (cannot extend another class) | Class is still free to extend another class |
| Tight coupling of task and thread | Loose coupling; task can be reused / shared, suits thread pools |
Preferred approach: implementing Runnable.
Justification: Java allows only single inheritance, so extending Thread blocks the class from extending any other class, whereas a class can implement Runnable and still extend another class. Runnable also cleanly separates the task (what to run) from the thread (how to run it), and is the form required by the ExecutorService thread-pool API and lambdas:
Runnable r = () -> System.out.println("Lambda task");
new Thread(r).start();
Explain the role of the ResultSet interface in JDBC. Differentiate between a forward-only and a scrollable result set, and write code to update a column value through an updatable ResultSet.
Role of the ResultSet Interface
ResultSet represents the table of data returned by executing a SQL query (typically a SELECT). It acts as a cursor pointing to a row of the result; methods like next() advance the cursor and getXxx("column") retrieve column values of the current row. It is obtained from Statement.executeQuery() or PreparedStatement.executeQuery().
Forward-only vs Scrollable ResultSet
Forward-only (TYPE_FORWARD_ONLY) | Scrollable (TYPE_SCROLL_INSENSITIVE / TYPE_SCROLL_SENSITIVE) |
|---|---|
Cursor moves only forward with next() | Cursor can move freely: next(), previous(), first(), last(), absolute(n) |
| Default, lowest overhead | Higher overhead; can re-read rows |
| Cannot revisit a row | Random navigation supported |
TYPE_SCROLL_INSENSITIVE does not reflect later DB changes; TYPE_SCROLL_SENSITIVE does.
Updating a column via an Updatable ResultSet
To update through the result set, request CONCUR_UPDATABLE concurrency:
Statement st = con.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = st.executeQuery("SELECT empId, salary FROM Employee");
while (rs.next()) {
if (rs.getInt("empId") == 101) {
rs.updateDouble("salary", 75000.0); // change column value
rs.updateRow(); // commit change to DB
}
}
What is the difference between an abstract class and an interface in Java? With the introduction of default and static methods, explain how interfaces have evolved since Java 8.
Abstract Class vs Interface
| Abstract Class | Interface |
|---|---|
Declared with abstract; can have both abstract and concrete methods | Declared with interface; traditionally only abstract methods |
| Can have instance fields and constructors | Fields are implicitly public static final (constants); no constructor |
| A class can extend only one abstract class | A class can implement many interfaces (multiple inheritance of type) |
| Can have any access modifier on members | Methods implicitly public |
| Represents an is-a relationship with shared state/behaviour | Represents a capability / contract |
Use an abstract class when classes share common state/implementation; use an interface to define a contract that unrelated classes can fulfil.
Evolution of Interfaces since Java 8
Before Java 8 an interface could contain only abstract methods (and constants). Since Java 8 interfaces may contain:
defaultmethods — methods with a body, so new methods can be added to an interface without breaking existing implementing classes; subclasses inherit the default unless they override it.staticmethods — utility methods called on the interface itself.- (Java 9 further added
privateinterface methods to share code between defaults.)
interface Vehicle {
void start(); // abstract
default void honk() { System.out.println("Beep!"); } // default method
static int wheels() { return 4; } // static method
}
This blurred the line between interfaces and abstract classes, though interfaces still cannot hold mutable instance state.
Frequently asked questions
- Where can I find the BE Computer Engineering (Pokhara University) Advanced Programming with Java (PU, CMP 228) question paper 2079?
- The full BE Computer Engineering (Pokhara University) Advanced Programming with Java (PU, CMP 228) 2079 (regular) question paper is available free on Kekkei. You can read every question online and attempt the paper under timed exam conditions.
- Does the Advanced Programming with Java (PU, CMP 228) 2079 paper come with solutions?
- Yes. Every question on this Advanced Programming with Java (PU, CMP 228) past paper includes a step-by-step solution, plus instant AI feedback when you attempt it on Kekkei.
- How many marks is the BE Computer Engineering (Pokhara University) Advanced Programming with Java (PU, CMP 228) 2079 paper?
- The BE Computer Engineering (Pokhara University) Advanced Programming with Java (PU, CMP 228) 2079 paper carries 100 full marks and is meant to be completed in 180 minutes, across 12 questions.
- Is practising this Advanced Programming with Java (PU, CMP 228) past paper free?
- Yes — reading and attempting this Advanced Programming with Java (PU, CMP 228) past paper on Kekkei is completely free.