UNIT 4
UNIT 4
UNIT 4
In this tutorial, we will learn about Java exceptions, it's types, and the difference between checked and
unchecked exceptions.
In Java, an exception is an event that disrupts the normal flow of the program. It is an object
which is thrown at runtime.
In Java, exception is an event that occurs during the execution of a program and disrupts the normal flow of
the program's instructions. Bugs or errors that we don't want and restrict our program's normal execution of
code are referred to as exceptions. In this section, we will focus on the types of exceptions in Java and the
differences between the two.
1. Built-in Exceptions
o Checked Exception
o Unchecked Exception
2. User-Defined Exceptions
3. Error
4.
Built-in Exception
Exceptions that are already available in Java libraries are referred to as built-in exception. These exceptions
are able to define the error situation so that we can understand the reason of getting this error. It can be
categorized into two broad categories, i.e., checked exceptions and unchecked exception.
Checked Exception
Checked exceptions are called compile-time exceptions because these exceptions are checked at compile-
time by the compiler. The compiler ensures whether the programmer handles the exception or not. The
programmer should have to handle the exception; otherwise, the system has shown a compilation error.
CheckedExceptionExample.java
1. import java.io.*;
2. class CheckedExceptionExample {
3. public static void main(String args[]) {
4. FileInputStream file_data = null;
5. file_data = new FileInputStream("C:/Users/ajeet/OneDrive/Desktop/Hello.txt");
6. int m;
7. while(( m = file_data.read() ) != -1) {
8. System.out.print((char)m);
9. }
10. file_data.close();
11. }
12. }
Built-in Exception
Exceptions that are already available in Java libraries are referred to as built-in
exception. These exceptions are able to define the error situation so that we can
understand the reason of getting this error. It can be categorized into two broad
categories, i.e., checked exceptions and unchecked exception.
Checked Exception
Checked exceptions are called compile-time exceptions because these exceptions are
checked at compile-time by the compiler. The compiler ensures whether the
programmer handles the exception or not. The programmer should have to handle the
exception; otherwise, the system has shown a compilation error.
In the above code, we are trying to read the Hello.txt file and display its data or content on the screen. The
program throws the following exceptions:
Unchecked Exceptions
The unchecked exceptions are just opposite to the checked exceptions. The compiler will not check these
exceptions at compile time. In simple words, if a program throws an unchecked exception, and even if we
didn't handle or declare it, the program would not give a compilation error. Usually, it occurs when the user
provides bad data during the interaction with the program.
Note: The RuntimeException class is able to resolve all the unchecked exceptions because of the child-parent
relationship.
UncheckedExceptionExample1.java
1. class UncheckedExceptionExample1 {
2. public static void main(String args[])
3. {
4. int postive = 35;
5. int zero = 0;
6. int result = positive/zero;
7. //Give Unchecked Exception here.
8. System.out.println(result);
9. }
10. }
In the above program, we have divided 35 by 0. The code would be compiled successfully, but it will throw
an ArithmeticException error at runtime. On dividing a number by 0 throws the divide by zero exception
that is a uncheck exception.
Description:
In the above code, we have created two classes,
i.e., UserDefinedException and NewException. The UserDefinedException has our main
method, and the NewException class is our user-defined exception class, which
extends exception. In the NewException class, we create a variable x of type integer and assign
a value to it in the constructor. After assigning a value to that variable, we return the exception
message.
In the UserDefinedException class, we have added a try-catch block. In the try section, we
throw the exception, i.e., NewException and pass an integer to it. The value will be passed to
the NewException class and return a message. We catch that message in the catch block and
show it on the screen.
1. These exceptions are checked at compile time. These exceptions These exceptions are just opposite to the ch
are handled at compile time too. exceptions are not checked and handled at comp
2. These exceptions are direct subclasses of exception but not They are the direct subclasses of the RuntimeExc
extended from RuntimeException class.
3. The code gives a compilation error in the case when a method The code compiles without any error because t
throws a checked exception. The compiler is not able to handle the notice of the compiler. These exceptions are th
exception on its own. errors in programming logic.
4. These exceptions mostly occur when the probability of failure is These exceptions occur mostly due to programm
too high.
6. These exceptions are propagated using the throws keyword. These are automatically propagated.
7. It is required to provide the try-catch and try-finally block to In the case of unchecked exception it is not mand
handle the checked exception.
Bugs or errors that we don't want and restrict the normal execution of the programs are referred
to as exceptions.
ArithmeticException, ArrayIndexOutOfBoundExceptions, ClassNotFoundExceptions etc. are come in the
category of Built-in Exception. Sometimes, the built-in exceptions are not sufficient to explain or describe
certain situations. For describing these situations, we have to create our own exceptions by creating an
exception class as a subclass of the Exception class. These types of exceptions come in the category
of User-Defined Exception.
Difference between Checked and Unchecked Exceptions
1) Checked Exception
The classes that directly inherit the Throwable class except RuntimeException and Error are known as
checked exceptions. For example, IOException, SQLException, etc. Checked exceptions are checked at
compile-time.
2) Unchecked Exception
The classes that inherit the RuntimeException are known as unchecked exceptions. For example,
ArithmeticException, NullPointerException, ArrayIndexOutOfBoundsException, etc. Unchecked exceptions
are not checked at compile-time, but they are checked at runtime.
3) Error
Error is irrecoverable. Some example of errors are OutOfMemoryError, VirtualMachineError, AssertionError
etc.
Keyword Description
try The "try" keyword is used to specify a block where we should place an exception code. It means we can't use try
must be followed by either catch or finally.
catch The "catch" block is used to handle the exception. It must be preceded by try block which means we can't use ca
followed by finally block later.
finally The "finally" block is used to execute the necessary code of the program. It is executed whether an exception is ha
throws The "throws" keyword is used to declare exceptions. It specifies that there may occur an exception in the me
exception. It is always used with method signature.
The catch statement allows you to define a block of code to be executed, if an error occurs in
the try block.
catch(Exception e) {
System.out.println(myNumbers[10]); // error!
}
}
If an error occurs, we can use try...catch to catch the error and execute some code to handle
it:
Example
public class Main {
try {
System.out.println(myNumbers[10]);
} catch (Exception e) {
Finally
The finally statement lets you execute code, after try...catch, regardless of the result:
Example
public class Main {
try {
System.out.println(myNumbers[10]);
} catch (Exception e) {
} finally {
There are many differences between throw and throws keywords. A list of differences between throw and
throws are given below:
5. Internal implementation We are allowed to throw only one exception We can declare m
at a time i.e. we cannot throw multiple throws keyword th
exceptions. method. For ex
IOException, SQLEx
Multithreading in Java
A thread is a lightweight sub-process, the smallest unit of processing. Multiprocessing and multithreading,
both are used to achieve multitasking.
However, we use multithreading than multiprocessing because threads use a shared memory area. They
don't allocate separate memory area so saves memory, and context-switching between the threads takes
less time than process.
3) Threads are independent, so it doesn't affect other threads if an exception occurs in a single thread.
Threads are independent. If there occurs exception in one thread, it doesn't affect other
threads. It uses a shared memory area.
As shown in the above figure, a thread is executed inside the process. There is context-
switching between the threads. There can be multiple processes inside the OS, and one
process can have multiple threads.
Multitasking
Multitasking is a process of executing multiple tasks simultaneously. We use multitasking to utilize the CPU.
Multitasking can be achieved in two ways:
In this article, you will learn about the difference between multitasking and multithreading in the operating
system. But before discussing the differences, you must know about multitasking and multithreading in the
operating system.
What is Multitasking?
When a single processor (CPU) does many jobs (program, threads, process, task) simultaneously, it is
called multitasking. The CPU switches between these activities often so the user can engage with each
program simultaneously to execute multitasking.
A multitasking operating system allows multiple users to share the system simultaneously. As we've seen,
the CPU switches between tasks quickly; as a result, moving between users takes some time. It puts an
impression on a user that the complete system is focused on him.
When numerous users share a multitasking OS, CPU scheduling and multiprogramming allow each user to
have at least a tiny fraction of the Multitasking OS and at least one application in memory for execution.
Advantages
1. The main concept and advantage of MOS is time-sharing. There is no CPU waiting time, and each
task is given an appropriate amount of time.
2. Any program with a long waiting time due to an I/O interrupt is transferred to virtual memory. The
program returns to RAM after the I/O operation is completed. MOS handles virtual memory
management really well.
3. When using multitasking, the operating system works smoothly. All types of computer users are
pleased. A user can run a single program or numerous programs without complaints about using a
comput
4. MOS can handle multiple users running multiple apps the best. All programs run without a hiccup in
performance. All OS users are given a suitable length of time.
5. Multiple programs, such as MS Word, MS Excel, Photoshop, a browser, games, and a calculator, can
operate concurrently.
Disadvantages
1. If the computer's processor is slow, it will process programs slowly and managing many programs
will take longer. Because they require more processing power, some heavy programs cannot
operate well on a slow processor.
2. When a computer user starts many programs simultaneously, the computer slows down. Because
numerous applications are put into the main memory, the CPU is unable to provide an appropriate
time for each program and the reaction time for performing the operation increases. It is a common
problem with PCs that do not have enough RAM.
3. Multitasking keeps the processor active all the time and increases CPU heat. You need to connect
your CPU's cooling system to resolve this issue. It typically occurs when you play heavy PC games.
What is Multithreading?
Multitasking occurs when the CPU does many tasks, such as a program, process, task, or thread. Tasks are
swapped regularly so that the user can complete all of the processes at the same time. Multiple users can
share the system simultaneously. OS multitasking is accomplished by CPU scheduling and
multiprogramming.
Multiple threads are formed during multithreading. A thread in multithreading refers to a process code
section. A thread is distinguished by its program counter, thread ID, stack, and registers. If we isolate each
service into its process, each processor will share code, data, and system resources. The system may get
overloaded if we do not generate threads. Creating threads can make working with a processor easier.
Multithreading improves responsiveness, which is the most significant advantage of adopting it. The main
advantage of multithreading is resource sharing, in which multiple process threads share the same code.
Advantages
Definition When a single processor does many jobs (program, threads, Multitasking occurs when the CPU
process, task) at the same time, it is referred to as multitasking. a program, process, task, or thread.
Basic A CPU may perform multiple tasks at once by using the Multithreading allows a CPU to ge
multitasking method. from a job and process them all at t
Resources and The system must assign different resources and memory to The system assigns a single memor
Memory separate programs that are running concurrently in multitasking.
Switching CPU switches between programs frequently. CPU switches between the threads
Working A user may easily run several jobs off of their CPU at once. A CPU has the ability to split a sin
threads to improve its functionality
Process The process of terminating a task takes comparatively more time. It requires considerably less time to
Termination
1. New
2. Active
3. Blocked / Waiting
4. Timed Waiting
5. Terminated
Active: When a thread invokes the start() method, it moves from the new state to the active state. The active
state contains two states within it: one is runnable, and the other is running.
o Runnable: A thread, that is ready to run is then moved to the runnable state. In the runnable state,
the thread may be running or may be ready to run at any given instant of time. It is the duty of the
thread scheduler to provide the thread time to run, i.e., moving the thread the running state.
A program implementing multithreading acquires a fixed slice of time to each individual thread. Each
and every thread runs for a short span of time and when that allocated time slice is over, the thread
voluntarily gives up the CPU to the other thread, so that the other threads can also run for their slice
of time. Whenever such a scenario occurs, all those threads that are willing to run, waiting for their
turn to run, lie in the runnable state. In the runnable state, there is a queue where the threads lie.
o Running: When the thread gets the CPU, it moves from the runnable to the running state. Generally,
the most common change in the state of a thread is from runnable to running and again back to
runnable.
Blocked or Waiting: Whenever a thread is inactive for a span of time (not permanently) then, either the
thread is in the blocked state or is in the waiting state.
For example, a thread (let's say its name is A) may want to print some data from the printer. However, at the
same time, the other thread (let's say its name is B) is using the printer to print some data. Therefore, thread
A has to wait for thread B to use the printer. Thus, thread A is in the blocked state. A thread in the blocked
state is unable to perform any execution and thus never consume any cycle of the Central Processing Unit
(CPU). Hence, we can say that thread A remains idle until the thread scheduler reactivates thread A, which is
in the waiting or blocked state.
When the main thread invokes the join() method then, it is said that the main thread is in the waiting state.
The main thread then waits for the child threads to complete their tasks. When the child threads complete
their job, a notification is sent to the main thread, which again moves the thread from waiting to the active
state.
If there are a lot of threads in the waiting or blocked state, then it is the duty of the thread scheduler to
determine which thread to choose and which one to reject, and the chosen thread is then given the
opportunity to run.
Timed Waiting: Sometimes, waiting for leads to starvation. For example, a thread (its name is A) has entered
the critical section of a code and is not willing to leave that critical section. In such a scenario, another thread
(its name is B) has to wait forever, which leads to starvation. To avoid such scenario, a timed waiting state is
given to thread B. Thus, thread lies in the waiting state for a specific span of time, and not forever. A real
example of timed waiting is when we invoke the sleep() method on a specific thread. The sleep() method
puts the thread in the timed wait state. After the time runs out, the thread wakes up and start its execution
from when it has left earlier.
Terminated: A thread reaches the termination state because of the following reasons:
o When a thread has finished its job, then it exists or terminates normally.
o Abnormal termination: It occurs when some unusual events such as an unhandled exception or
segmentation fault.
A terminated thread means the thread is no more in the system. In other words, the thread is dead, and
there is no way one can respawn (active after kill) the dead thread.
The following diagram shows the different states involved in the life cycle of a thread.
Thread class:
Thread class provide constructors and methods to create and perform operations on a thread.Thread class
extends Object class and implements Runnable interface.
public final int getPriority(): The java.lang.Thread.getPriority() method returns the priority of the given thread.
public final void setPriority(int newPriority): The java.lang.Thread.setPriority() method updates or assign the
priority of the thread to newPriority. The method throws IllegalArgumentException if the value newPriority
goes out of the range, which is 1 (minimum) to 10 (maximum).
Default priority of a thread is 5 (NORM_PRIORITY). The value of MIN_PRIORITY is 1 and the value of
MAX_PRIORITY is 10.
FileName: ThreadPriorityExample1.java
Synchronization in Java
Synchronization in Java is the capability to control the access of multiple threads to any
shared resource.
Java Synchronization is better option where we want to allow only one thread to access
the shared resource.
Why use Synchronization?
The synchronization is mainly used to
Types of Synchronization
There are two types of synchronization
1. Process Synchronization
2. Thread Synchronization
Thread Synchronization
There are two types of thread synchronization mutual exclusive and inter-thread
communication.
1. Mutual Exclusive
1. Synchronized method.
2. Synchronized block.
3. Static synchronization.
Mutual Exclusive
Mutual Exclusive helps keep threads from interfering with one another while sharing
data. It can be achieved by using the following three ways:
TestSynchronization1.java
1. class Table{
2. void printTable(int n){//method not synchronized
3. for(int i=1;i<=5;i++){
4. System.out.println(n*i);
5. try{
6. Thread.sleep(400);
7. }catch(Exception e){System.out.println(e);}
8. }
9.
10. }
11. }
12.
13. class MyThread1 extends Thread{
14. Table t;
15. MyThread1(Table t){
16. this.t=t;
17. }
18. public void run(){
19. t.printTable(5);
20. }
21.
22. }
23. class MyThread2 extends Thread{
24. Table t;
25. MyThread2(Table t){
26. this.t=t;
27. }
28. public void run(){
29. t.printTable(100);
30. }
31. }
32.
33. class TestSynchronization1{
34. public static void main(String args[]){
35. Table obj = new Table();//only one object
36. MyThread1 t1=new MyThread1(obj);
37. MyThread2 t2=new MyThread2(obj);
38. t1.start();
39. t2.start();
40. }
41. }
When a thread invokes a synchronized method, it automatically acquires the lock for
that object and releases it when the thread completes its task.
TestSynchronization2.java
Cooperation (Inter-thread communication) is a mechanism in which a thread is paused running in its critical
section and another thread is allowed to enter (or lock) in the same critical section to be executed.It is
implemented by following methods of Object class:
o wait()
o notify()
o notifyAll()
1) wait() method
The wait() method causes current thread to release the lock and wait until either another thread invokes the
notify() method or the notifyAll() method for this object, or a specified amount of time has elapsed.
The current thread must own this object's monitor, so it must be called from the synchronized method only
otherwise it will throw exception.
Method Description
public final void wait(long timeout)throws InterruptedException It waits for the specified amount o
2) notify() method
The notify() method wakes up a single thread that is waiting on this object's monitor. If any threads are
waiting on this object, one of them is chosen to be awakened. The choice is arbitrary and occurs at the
discretion of the implementation.
Syntax:
3) notifyAll() method
Wakes up all threads that are waiting on this object's monitor.
Syntax:
wait() sleep()
The wait() method releases the lock. The sleep() method doesn't release the lock.
It should be notified by notify() or notifyAll() methods After the specified amount of time, sleep is comple
Test.java
1. class Customer{
2. int amount=10000;
3.
4. synchronized void withdraw(int amount){
5. System.out.println("going to withdraw...");
6.
7. if(this.amount<amount){
8. System.out.println("Less balance; waiting for deposit...");
9. try{wait();}catch(Exception e){}
10. }
11. this.amount-=amount;
12. System.out.println("withdraw completed...");
13. }
14.
15. synchronized void deposit(int amount){
16. System.out.println("going to deposit...");
17. this.amount+=amount;
18. System.out.println("deposit completed... ");
19. notify();
20. }
21. }
22.
23. class Test{
24. public static void main(String args[]){
25. final Customer c=new Customer();
26. new Thread(){
27. public void run(){c.withdraw(15000);}
28. }.start();
29. new Thread(){
30. public void run(){c.deposit(10000);}
31. }.start();
32.
33. }}
Output:
going to withdraw...
Less balance; waiting for deposit...
going to deposit...
deposit completed...
withdraw completed