OOP:
OOP:
OOP:
OOP:
J
Ad
d
J
Ad
d
Java Advanced
Java Advanced
Romi
Romi Satria
Satria Wahono
Wahono
Romi
Romi Satria
Satria Wahono
Wahono
romi@romisatriawahono.net
romi@romisatriawahono.net
http //romisatriawahono net
http //romisatriawahono net
http://romisatriawahono.net
http://romisatriawahono.net
HP: 0878
HP: 0878--80480485
80480485
YM
YM r mi s
r mi s
YM:
Romi Satria Wahono
Romi Satria Wahono
Lahir di Madiun, 2 Oktober 1974
Lahir di Madiun, 2 Oktober 1974
SD Sompok
SD Sompok
Semarang (1987)
Semarang (1987)
SMPN 8
SMPN 8
Semarang (1990)
Semarang (1990)
gg
SMA Taruna Nusantara
SMA Taruna Nusantara
, Magelang (1993)
, Magelang (1993)
S1 S2 dan S3 (on
S1 S2 dan S3 (on leave) dari
leave) dari Department
Department of Computer
of Computer
S1, S2 dan S3 (on
S1, S2 dan S3 (on--leave) dari
leave) dari Department
Department of Computer
of Computer
Sciences,
Sciences,
Saitama University
Saitama University
, Japan (1994
, Japan (1994--2004)
2004)
C
C
t
C
C
t
S ft
S ft
E i
E i
i
i
L
L
i
i
Core Competence:
Core Competence:
Software
Software Engineering
Engineering
, eLearning
, eLearning
System, Knowledge Management
System, Knowledge Management
ll
Founder
Founder dan
dan Koordinator
Koordinator
IlmuKomputer.Com
IlmuKomputer.Com
Materi
Materi
1.1.
OOP Concepts
OOP Concepts
::
K
p d P di
Obj t
K
p d P di
Obj t O i t d
O i t d
Konsep dan Paradigma Object
Konsep dan Paradigma Object--Oriented
Oriented
2.
2.
Java Fundamentals
Java Fundamentals
::
Memahami Sintaks dan Grammar Bahasa Java
Memahami Sintaks dan Grammar Bahasa Java
33
Java Advanced
Java Advanced
::
3.
3.
Java Advanced
Java Advanced
::
Eksepsi, Thread, Java API
Eksepsi, Thread, Java API
4.
4.
Java GUI
Java GUI
::
Swing, GUI Component, Event Handling
Swing, GUI Component, Event Handling
5.
5.
Java GUI with Netbeans
Java GUI with Netbeans
::
Mengembangkan Aplikasi Berbasis GUI dengan Java
Mengembangkan Aplikasi Berbasis GUI dengan Java
Mengembangkan Aplikasi Berbasis GUI dengan Java
Mengembangkan Aplikasi Berbasis GUI dengan Java
Materi
Materi Diskusi
Diskusi
PP
Ek
Ek
i
i
1.1.
Penanganan
Penanganan Eksepsi
Eksepsi
22
Thread
Thread dan
dan Multithreading
Multithreading
2.
2.
Thread
Thread dan
dan Multithreading
Multithreading
33
I/O Stream
I/O Stream
3.
3.
I/O Stream
I/O Stream
4.
Penanganan
Penanganan
Penanganan
Penanganan
Ek
i
Ek
i
Eksepsi
Eksepsi
Eksepsi
Eksepsi
Eksepsi
Eksepsi adalah
pp
adalah
kondisi
kondisi abnormal
abnormal
yang
yang
y g
y g
terjadi
terjadi pada
pada
saat suatu perintah dieksekusi
saat suatu perintah dieksekusi
K tik
K tik k p i
k p i t j di
t j di p d
p d
tt
th d
th d
Ketika
Ketika eksepsi
eksepsi terjadi
terjadi pada
pada suatu
suatu method,
method,
ada
ada dua pilihan yang dapat dilakukan:
dua pilihan yang dapat dilakukan:
p
p
y g p
y g p
1.1.
Menangani
Menangani sendiri
sendiri
eksepsi
eksepsi
ll
hh
2.
2.
Meneruskannya
Meneruskannya ke
ke luar
luar
(throw)
(throw)
Keyword
Keyword eksepsi
eksepsi
Keyword
Keyword eksepsi
eksepsi::
try, catch, finally,
Bentuk
Bentuk Penanganan
Penanganan Eksepsi
Eksepsi
try{
try{
// code
// code yg
yg mengakibatkan
mengakibatkan eksepsi
eksepsi
}catch(TipeEksepsi1
}catch(TipeEksepsi1 objekEksepsi
objekEksepsi){
){
// code utk menangani eksepsi yg cocok dg TipeEksepsi1
// code utk menangani eksepsi yg cocok dg TipeEksepsi1
}}
...
...
catch(
catch(TipeeksepsiN
TipeeksepsiN objekEksepsi
objekEksepsi){
){
// code utk menangani eksepsi yg cocok dg TipeEksepsiN
// code utk menangani eksepsi yg cocok dg TipeEksepsiN
}finally{
}finally{
//code yg pasti dieksekusi setelah blok try
//code yg pasti dieksekusi setelah blok try--catch dieksekusi
catch dieksekusi
Hirarki
3
3 Tipe
Tipe Eksepsi
Eksepsi
11
Eksepsi yang
Eksepsi yang
Tidak Dicek
Tidak Dicek
1.1.
Eksepsi yang
Eksepsi yang
Tidak Dicek
Tidak Dicek
22
Error
Error
2.
2.
Error
Error
33
Eksepsi
Eksepsi yang
yang
D
Dicek
icek
3.
Tipe
Tipe Eksepsi
Eksepsi Yang
Yang Tidak
Tidak Dicek
Dicek
Semua
Semua eksepsi
eksepsi bertipe
bertipe
RuntimeException
RuntimeException
dan
dan
turunannya
turunannya
tidak
tidak harus
harus secara
secara eksplisit
eksplisit ditangani
ditangani
turunannya
turunannya
tidak
tidak harus
harus secara
secara eksplisit
eksplisit ditangani
ditangani
dalam
dalam program
program
.. Contohnya
Contohnya: :
ArrayIndexOutofBoundException
ArrayIndexOutofBoundException
ArrayIndexOutofBoundException
ArrayIndexOutofBoundException, ,
AritmeticException
AritmeticException, , dsb
dsb
P
d
k
P
d
k
t t d
t t d
t
t
Program dengan eksepsi ini
Program dengan eksepsi ini
tetap dapat
tetap dapat
dikompilasi
dikompilasi
, meskipun ketika dijalankan akan
, meskipun ketika dijalankan akan
ll
mengeluarkan
mengeluarkan
pesan
pesan eksepsi
eksepsi dan
dan eksekusi
eksekusi
berakhir
berakhir
Supaya ekseksi tidak berakhir, bisa
Supaya ekseksi tidak berakhir, bisa menggunakan
menggunakan
blok
blok try
try--catch
catch
blok
DemoEksepsi.java
DemoEksepsi.java
ll
class
class DemoEksepsi
DemoEksepsi{{
public static void main(String[]
public static void main(String[] args
args){
){
public static void main(String[]
public static void main(String[] args
args){
){
int
int[]
[] arr
arr = new
aa
= new int
int[1];
[1];
;;
System.out.println
System.out.println((arr
arr[1]);
[1]);
}}
}}}}
Tipe
Tipe Eksepsi
Eksepsi Error
Error
TTipe
ipe eksepsi
eksepsi yang
yang seharusnya
seharusnya
tidak
tidak
TTipe
ipe eksepsi
eksepsi yang
yang seharusnya
seharusnya
tidak
tidak
ditangani dengan blok try
ditangani dengan blok try--catch
g
g
g
g
y
y
catch
karena berhubungan dengan Java
karena berhubungan dengan Java
ti
ti
tt
runtime
runtime system
system
Error
Error merupakan
merupakan eksepsi
eksepsi yang
yang
Error
Error merupakan
merupakan eksepsi
eksepsi yang
yang
sangat
sangat kritis
gg
kritis dan
dan
tidak
tidak perlu
perlu
pp
ditangani
Tipe
Tipe Eksepsi
Eksepsi Yang
Yang Dicek
Dicek
Semua eksepsi yang
Semua eksepsi yang
bukan turunan
bukan turunan
Semua eksepsi yang
Semua eksepsi yang
bukan turunan
bukan turunan
class
class RuntimeException
RuntimeException
pp
adalah
adalah
eksepsi
eksepsi yang
yang
harus
harus ditangani
ditangani dengan
dengan
bl k
bl k tt
t h
t h
blok
blok try
try--catch
catch
Program
Program
tidak bisa dikompilasi
tidak bisa dikompilasi
Program
Program
tidak bisa dikompilasi
tidak bisa dikompilasi
apabila
DemoEksepsi2.java
DemoEksepsi2.java
import java.io.*;
import java.io.*;
class DemoEksepsi2{
class DemoEksepsi2{
Public static void main(String[]
Public static void main(String[] args
args){
){
File
File myFile
myFile = new File(“test txt”);
= new File(“test txt”);
File
File myFile
myFile new File( test.txt );
new File( test.txt );
myFile.createNewFile
myFile.createNewFile();
();
}}
DemoEksepsi3.java
DemoEksepsi3.java
imp rt ja a i *
imp rt ja a i *
import java.io.*;
import java.io.*;
l D
Ek
i3{
l D
Ek
i3{
class DemoEksepsi3{
class DemoEksepsi3{
public static void main(String[]
public static void main(String[] args
args){
){
tt
{{
try
try
{{
File
File myFile
myFile = new File("test.txt");
= new File("test.txt");
l
l
l
l ()
()
myFile.createNewFile
myFile.createNewFile();
();
System.out.println
System.out.println("File
("File berhasil
berhasil dibuat
dibuat");
");
}}
catch
catch
((IOException
IOException e){
e){
ll
ll
ll
System.out.println
System.out.println(“File
(“File gagal
gagal dibuat
dibuat");
");
}}
}}
}}
Mengapa
Mengapa Eksepsi
Eksepsi Perlu
Perlu Ditangani
Ditangani
Kita
Kita ingin
ingin program
program kita
kita bisa
bisa
memperbaiki
memperbaiki
kesalahan akibat eksepsi
kesalahan akibat eksepsi
dan terus
dan terus
melanjutkan
melanjutkan
kesalahan akibat eksepsi
kesalahan akibat eksepsi
dan terus
dan terus
melanjutkan
melanjutkan
eksekusi
eksekusi
seolah
seolah--olah tidak pernah terjadi eksepsi
olah tidak pernah terjadi eksepsi
f
)
f
)
Pengguna
Pengguna program(software)
program(software) umumnya
umumnya
tidak
tidak peduli
peduli ((mengerti
pp
mengerti)
gg
) bagaimana
bagaimana sebuah
gg
sebuah
program
program dieksekusi
dieksekusi sehingga
sehingga akhirnya
akhirnya
muncul
muncul pesan
pesan kesalahan Kita ingin
kesalahan Kita ingin
pesan
pesan
muncul
muncul pesan
pesan kesalahan. Kita ingin
kesalahan. Kita ingin
pesan
pesan
kesalahan tadi
kesalahan tadi dipahami
dipahami oleh
oleh pengguna
pengguna
K t
K t
t t
t t b
b
l
l dd
Kita
Kita ingin
ingin
program
program tetap
tetap berjalan
berjalan dan
dan
bukannya
Catch
Catch Bertingkat
Bertingkat
Code yang
Code yang ada
ada dalam
dalam blok
blok try
try bisa
bisa saja
saja
kib tk l bih d i t j i k
i
kib tk l bih d i t j i k
i
mengakibatkan lebih dari satu jenis eksepsi
mengakibatkan lebih dari satu jenis eksepsi
Kita
Kita dapat
dapat menuliskan
menuliskan
lebih
lebih dari
dari satu
satu blok
blok catch
catch
untuk
untuk setiap
setiap blok
blok try
try
Blok catch
Blok catch dengan
dengan tipe
tipe data subclass
data subclass harus
harus
ditulis
ditulis
Blok catch
Blok catch dengan
dengan tipe
tipe data subclass
data subclass harus
harus
ditulis
ditulis
terlebih dahulu
terlebih dahulu
daripada tipe data
daripada tipe data superclass
superclass--nya
nya
E
pti
E
pti adalah
adalah p la
p la da i
da i
Exception
Exception adalah
adalah superclass
superclass dari
dari
ArithmeticException
ArithmeticException dan
dan
A
I d O tOfB
d E
t
A
I d O tOfB
d E
t
hh
ArrayIndexOutOfBoundsException
ArrayIndexOutOfBoundsException sehingga
sehingga
harus
DemoEksepsi4.java
DemoEksepsi4.java
l D Ek 4{ l D Ek 4{ class DemoEksepsi4{ class DemoEksepsi4{public static void main(String[]
public static void main(String[] argsargs){){
try tryyy{{
int
int x = x = args.lengthargs.length; ; intint y = 100/x;y = 100/x; int
int[] [] arrarr = {0,1,2,3};= {0,1,2,3}; y =
y = arrarr[x][x] y =
y = arrarr[x];[x];
System.out.println
System.out.println("("JumlahJumlah argument: " + y);argument: " + y); System.out.println
System.out.println("("TidakTidak terjaditerjadi eksepsieksepsi");"); }}catch(catch(ArithmeticExceptionArithmeticException e)e){{
System.out.println
System.out.println("("TerjadiTerjadi eksepsieksepsi karenakarena pembagianpembagian dengandengan nolnol“ +“ + e.getMessage
e.getMessage());()); e.getMessage e.getMessage());());
}}catch(catch(ArrayIndexOutOfBoundsExceptionArrayIndexOutOfBoundsException e)e){{
System.out.println("Terjadi eksepsi karena indeks di luar kapasitas"); System.out.println("Terjadi eksepsi karena indeks di luar kapasitas"); }} t h(t h(ThTh blbl )){{
}}catch(catch(ThrowableThrowable e)e){{ System.out.println
System.out.println("("TerjadiTerjadi eksepsieksepsi ygyg tidaktidak diketahuidiketahui");"); }}
System.out.println
System.out.println("("SetelahSetelah blokblok try catch");try catch"); }}
DemoEksepsi5.java
DemoEksepsi5.java
l k
{
l k
{
class DemoEksepsi5{
class DemoEksepsi5{
public static void main(String[]
public static void main(String[] args
args){
){
double BILANGAN = 100 0;
double BILANGAN = 100 0;
double BILANGAN 100.0;
double BILANGAN 100.0;
System.out.println
System.out.println("
("Sebelum
Sebelum pembagian
pembagian");
");
for(
for(int
int ii=5;
=5; ii>=0;
>=0; ii--
--){
){
try
try
{{
S t
t
tl
S t
t
tl (BILANGAN "/"
(BILANGAN "/" " ")
" ")
System.out.println
System.out.println(BILANGAN + "/" +
(BILANGAN + "/" + ii + " = ");
+ " = ");
System.out.println
System.out.println(BILANGAN/
(BILANGAN/ii);
);
}}
finally
finally
{{
System.out.println
System.out.println("
("Bagian
Bagian finally
finally dijalankan
dijalankan");
");
}}
}}
S t
t i tl
S t
t i tl ("P
("P
l i
l i")
")
System.out.println
System.out.println("Program
("Program selesai
selesai");
");
}}
Melontarkan
Melontarkan Eksepsi
Eksepsi (throw)
(throw)
Keyword throw
Keyword throw digunakan
y
y
d
d
digunakan untuk
d g a a
d g a a
untuk
melontarkan
melontarkan eksepsi
eksepsi
B t k
B t k
Bentuk
Bentuk::
throw
throw variabelObjek
variabelObjek;;
throw
DemoThrow.java
DemoThrow.java
ll
hh
class
class DemoThrow
DemoThrow{{
public static void main(String[]
public static void main(String[] args
args){
){
p
g
p
g
gg
RuntimeException
RuntimeException r = new
r = new
RuntimeException
RuntimeException("
("Eksepsi
Eksepsi RuntimeException
RuntimeException");
");
RuntimeException
RuntimeException(( Eksepsi
Eksepsi RuntimeException
RuntimeException );
);
S t
t pri tl
S t
t pri tl ("
("S b l
S b l
Thr ")
Thr ")
System.out.println
System.out.println("
("Sebelum
Sebelum Throw");
Throw");
throw(r);
throw(r);
}}
throws
throws untuk
untuk Eksepsi
Eksepsi Method
Method
hh
kk
kk
Keyword throws
Keyword throws digunakan
digunakan untuk
untuk
memberitahu
memberitahu bahwa
bahwa
suatu
suatu method
method ada
ada
kemungkinan
kemungkinan menghasilkan
menghasilkan suatu
suatu eksep
eksep
sisi
Bentuk
Bentuk
Bentuk
Bentuk::
public
public tipe
tipe namaMethod
namaMethod() throws
() throws JenisEksepsi
JenisEksepsi{{
...
...
}}
atau
atau
public
public tipe
tipe namaMethod
namaMethod() throws JenisEksepsi1,
() throws JenisEksepsi1,
JenisEksepsi2, JenisEksepsi3...{
JenisEksepsi2, JenisEksepsi3...{
...
...
}}
DemoThrows.java
DemoThrows.java
import java.io.*;
import java.io.*;
class
class DemoThrows
DemoThrows{{
public static void main(String[]
public static void main(String[] args
args){
){
class
class SuatuKelas
SuatuKelas{{
public static void main(String[]
public static void main(String[] args
args){
){
SuatuKelas
SuatuKelas objobj = new = new SuatuKelasSuatuKelas();();
obj.metodeA
obj.metodeA();
();
// Method
// Method tanpa
tanpa throws
throws
public void
public void metodeA
metodeA(){
(){
S t
t
tl
S t
t
tl (“
(“M t d A
M t d A”)
”)
obj.metodeB
obj.metodeB();
();
}}
}}
System.out.println
System.out.println(“
(“MetodeA
MetodeA”);
”);
}}
}}
// Method
// Method dengan
dengan throws
throws
public void
public void metodeB
metodeB() throws
() throws
IOException
IOException{{
System.out.println
System.out.println(“
(“MetodeB
MetodeB”);
”);
}}}}
DemoThrows2.java
DemoThrows2.java
import java.io.*;
import java.io.*;
class
class SuatuKelas
SuatuKelas{{
public class
public class DemoThrows
DemoThrows{{
public static void main(String[]
public static void main(String[] args
args){
){
class
class SuatuKelas
SuatuKelas{{
public void
public void metodeA
metodeA(){
(){
System.out.println
System.out.println("
("MetodeA
MetodeA");
");
public static void main(String[]
public static void main(String[] args
args){
){
SuatuKelas
SuatuKelas obj
obj = new
= new SuatuKelas
SuatuKelas();
();
obj.metodeA
obj.metodeA();
();
}}
bl d
bl d t d B
t d B() th
() th
obj.metodeB
obj.metodeB();
();
}}
}}
public void
public void metodeB
metodeB() throws
() throws
IOException
IOException{{
System.out.println
System.out.println("
("MetodeB
MetodeB");
");
}}
y
p
y
p
dd
;;
}}
}}
Th
d
Th
d d
d
Thread
Thread dan
dan
Multithreading
Multithreading
Konsep
Konsep Thread
Thread
Thread
Thread
: : sekumpulan
sekumpulan instruksi
instruksi ((proses
proses) yang
) yang
dieksekusi
dieksekusi secara
secara independen
independen
die se si
die se si se a a
se a a independen
independen
Multithreading
Multithreading
: : suatu
suatu kemampuan
kemampuan yang
yang
memungkinkan
memungkinkan beberapa
beberapa kumpulan
kumpulan instruksi
instruksi
memungkinkan
memungkinkan beberapa
beberapa kumpulan
kumpulan instruksi
instruksi
(proses) dijalankan secara bersamaan (time slicing)
(proses) dijalankan secara bersamaan (time slicing)
dalam
dalam sebuah
sebuah program
program
dalam
dalam sebuah
sebuah program
program
Multithreading
Multithreading bermanfaat
bermanfaat untuk
untuk membuat
membuat
proses
proses
yang interaktif
yang interaktif
misalnya pada program permainan
misalnya pada program permainan
yang interaktif
yang interaktif
, misalnya pada program permainan
, misalnya pada program permainan
(game). Program tetap dapat menggerakkan
(game). Program tetap dapat menggerakkan
beberapa
beberapa objek
objek sambil
sambil memberi
memberi kesempatan
kesempatan
beberapa
beberapa objek
objek sambil
sambil memberi
memberi kesempatan
kesempatan
pengguna
pengguna melakukan
melakukan respon
respon melalui
melalui mouse
mouse atau
atau
keyboard
keyboard
keyboard
keyboard
Penggunaan
Penggunaan Thread
Thread
1.1.
Membuat
Membuat class yang
class yang mengimplementasi
mengimplementasi
interface
interface Runnable
Runnable dan
dan method run()
method run()
interface
interface Runnable
Runnable dan
dan method run()
method run()
class
class NamaClass
NamaClass implements
implements Runnable
Runnable{{
public void run(){
public void run(){
public void run(){
public void run(){
... }
... }
}}}}
2.
2.
Membuat
Membuat class yang
class yang merupakan
merupakan turunan
turunan class
class
Thread
Thread dan
dan meng
meng--override method run()
override method run()
class
class NamaClass
NamaClass extends Thread {
extends Thread {
public void run(){
public void run(){
... }
... }
}}
Kiat
Kiat Memilih
Memilih Penggunaan
Penggunaan Thread
Thread
Jika
Jika perlu
perlu meng
meng--override
override beberapa
beberapa method
method
milik
milik class Thread
class Thread
gunakan
gunakan turunan
turunan class
class
milik
milik class Thread
class Thread
gunakan
gunakan turunan
turunan class
class
Thread
Thread
ll
ff
bl
bl
Teknik
Teknik mengimplementasi
mengimplementasi interface
interface Runnable
Runnable
harus
harus digunakan
digunakan, , jika
gg
,, jj
jika kita
kita
membuat
membuat class yang
class yang
y g
y g
merupakan turunan dari class lain
merupakan turunan dari class lain
. Karena
. Karena
java
java
tidak
tidak mengenal
mengenal multiple inheritance
multiple inheritance
teknik
teknik
tidak
tidak mengenal
mengenal multiple inheritance
multiple inheritance
, , teknik
teknik
membuat
membuat turunan
turunan class Thread
class Thread tidak
tidak bisa
bisa
digunakan
digunakan
digunakan
digunakan
ThreadBeraksi1.java
ThreadBeraksi1.java
class Mobil implements
class Mobil implements aa pp nn RunnableRunnablennanna {{{{ String
String namanama;;
public Mobil(String id){ public Mobil(String id){
nama
nama = id;= id; nama
nama = id;= id; }}
public void run(){ public void run(){
f (
f ( tt 0 5 0 5 ){){ for(
for(intint ii=0;i<5; =0;i<5; ii++){++){ try{
try{
Thread.currentThread
Thread.currentThread().sleep(1000);().sleep(1000); }catch(
}catch(InterruptedExceptionInterruptedException ieie){){ System.out.println
System.out.println("("TerinterupsiTerinterupsi");"); }}}}
}}
}} System.out.printlnSystem.out.println("Thread" + ("Thread" + namanama + ": + ": PosisiPosisi " +" +ii);); }}}
}}}
public class ThreadBeraksi1{ public class ThreadBeraksi1{ public class ThreadBeraksi1{ public class ThreadBeraksi1{
public static void main(String[]
public static void main(String[] argsargs){){
Thread m1 = new Thread(new Mobil("M
Thread m1 = new Thread(new Mobil("M--1"));1")); Th d 2 Th d( M bil("M
Th d 2 Th d( M bil("M 2"))2")) Thread m2 = new Thread(new Mobil("M
Thread m2 = new Thread(new Mobil("M--2"));2")); m1.start(); m2.start();
m1.start(); m2.start(); }}
ThreadBeraksi2.java
ThreadBeraksi2.java
class Mobil extends Thread{ class Mobil extends Thread{aa ndnd ad{ad{ public Mobil(String id){ public Mobil(String id){
super(id); super(id); }}}}
public void run(){ public void run(){
String nama = getName(); String nama = getName(); f ( t 0 5 ){
f ( t 0 5 ){ for(int i=0; i<5; i++){ for(int i=0; i<5; i++){
try{ try{ sleep(1000); sleep(1000); }catch(InterruptedException ie){ }catch(InterruptedException ie){ System.out.println("Terinterupsi"); System.out.println("Terinterupsi"); }}}}
}} System.out.println("Thread" + nama + ": Posisi " +i); }} System.out.println("Thread" + nama + ": Posisi " +i); }}}
}}}
public class ThreadBeraksi2{ public class ThreadBeraksi2{ public class ThreadBeraksi2{ public class ThreadBeraksi2{
public static void main(String[] args){ public static void main(String[] args){
Mobil m1 = new Mobil("M
Mobil m1 = new Mobil("M--1");1"); M bil 2 M bil("M
M bil 2 M bil("M 2")2") Mobil m2 = new Mobil("M
Mobil m2 = new Mobil("M--2");2"); m1.start(); m2.start();
m1.start(); m2.start(); }}
Method Class Thread
Method Class Thread
Method
Method DeskripsiDeskripsi
static Thread
static Thread currentThreadcurrentThread()() CekCek didi Java APIJava API String
String getNamegetName()() int
int getPrioritygetPriority()() Boolean
Boolean isAliveisAlive()() void join()
void join() id j i (l
id j i (l illiilli )) void join(long
void join(long millismillis)) void join(long
void join(long millismillis)) void run()
void run() void run() void run() String
String setNamesetName()() static void sleep(
static void sleep(longmillislongmillis)) static void sleep(
static void sleep(longmillislongmillis, , intint nanosnanos)) void start()
Method
Method isAlive
isAlive()
()
Method
Method isAlive
isAlive()
() digunakan
digunakan untuk
gg
untuk
mengetahui
mengetahui apakah
apakah suatu
suatu thread
thread
ih
ih hid
hid
tt
d h
d h
titi
masih
masih hidup
hidup atau
atau sudah
sudah mati
mati
Method
Method isAlive
isAlive()
() memberikan
memberikan nilai
nilai
Method
Method isAlive
isAlive()
() memberikan
memberikan nilai
nilai
balik
balik
true
true apabila
apabila thread
pp
thread masih
masih
hidup
hidup
dan
dan
false
false apabila
apabila sudah
sudah mati
mati
( t
l
( t
l b l
b l
))
(return value =
ThreadBeraksi3.java
ThreadBeraksi3.java
Tambahkan
Tambahkan code
code di
di bawah
bawah pada
pada method main
method main pada
pada class
class
ThreadBeraksi2,
ThreadBeraksi2, ubah
ubah class
class menjadi
menjadi ThreadBeraksi3
ThreadBeraksi3
boolean
boolean m1Berakhir = false;
m1Berakhir = false;
boolean
boolean m2Berakhir = false
m2Berakhir = false
boolean
boolean m2Berakhir = false;
m2Berakhir = false;
do{
do{
if(!m1Berakhir && !m1 isAlive()){
if(!m1Berakhir && !m1 isAlive()){
if(!m1Berakhir && !m1.isAlive()){
if(!m1Berakhir && !m1.isAlive()){
m1Berakhir = true;
m1Berakhir = true;
System.out.println
System.out.println(“Thread m1
(“Thread m1 berakhir
berakhir”);
”);
System.out.println
System.out.println( Thread m1
( Thread m1 berakhir
berakhir );
);
}}
if(!m2Berakhir && !m2.isAlive()){
if(!m2Berakhir && !m2.isAlive()){
m2Berakhir = true;
m2Berakhir = true;
System.out.println
System.out.println(“Thread m2
(“Thread m2 berakhir
berakhir”);
”);
}}
} while (!m1Berakhir || !m2Berakhir);
} while (!m1Berakhir || !m2Berakhir);
Sinkronisasi
Sinkronisasi
Pada
Pada berapa
berapa kondisi
kondisi, ,
proses
proses secara
secara bersamaan
bersamaan
terkadang
terkadang tidak
tidak memungkinkan
memungkinkan
terkadang
terkadang tidak
tidak memungkinkan
memungkinkan
Contoh
Contoh: : proses
proses I/O stream
I/O stream khususnya
khususnya pada proses
pada proses
membaca dan menulis suatu data atau
membaca dan menulis suatu data atau file
file
membaca dan menulis suatu data atau
membaca dan menulis suatu data atau file
file
Proses
Proses thread
thread pembacaan
pembacaan atau
atau penulisan
penulisan data
data
dd t d k
t d k bb
kk
hh
d t
d t dd f l
f l
menjadi
menjadi tidak
tidak benar
benar karena
karena seharusnya
seharusnya data
data dan
dan file
file
tersebut
tersebut berubah
berubah--ubah
ubah ((
sedang
sedang dibuka
dibuka dan
dan ditulis
ditulis
l h
l h th d l
th d l
))
oleh
oleh thread lain
thread lain
))
Untuk kondisi diatas perlu dilakukan
Untuk kondisi diatas perlu dilakukan
proses
proses
sinkronisasi
sinkronisasi
dengan
dengan menggunakan
menggunakan
keyword
keyword
synchronized
Cara
Cara Penggunaan
Penggunaan Synchronized
Synchronized
1.1.
Sinkronisasi
Sinkronisasi pada
pada method
method
: : mendeklarasikan
mendeklarasikan
hh
suatu
suatu method
method dengan
dengan menggunakan
menggunakan
keyword synchronized
keyword synchronized
y
y
d y
d y
d
d
S k
d b k
S k
d b k
b hk
b hk
bl k
bl k
2.
2.
Sinkronisasi pada objek
Sinkronisasi pada objek
: menambahkan blok
: menambahkan blok
di
di bawah
bawah pada
pada pemanggilan
pp
pemanggilan objek
p
p
gg
gg
objek
jj
synchronized (
synchronized (objek
objek){
){
...
...
}}
Sinkronisasi
Sinkronisasi pada
pada M
Method
ethod (ThreadBeraksi4.java)
(ThreadBeraksi4.java)
1.1.
Pada
Pada ThreadBeraksi2.java,
ThreadBeraksi2.java, ubah
ubah run()
run() pada
pada
class Mobil:
class Mobil:
class Mobil:
class Mobil:
public void run(){ public void run(){String
String namanama = = getNamegetName();(); Si k i iK l i f ( Si k i iK l i f ( )) SinkronisasiKeluaran.info( SinkronisasiKeluaran.info(namanama);); }}
2
2
Buat class SinkronisasiKeluaran dengan code:
Buat class SinkronisasiKeluaran dengan code:
2.
2.
Buat class SinkronisasiKeluaran dengan code:
Buat class SinkronisasiKeluaran dengan code:
class SinkronisasiKeluaran{ class SinkronisasiKeluaran{
public static synchronized void info(String nama){ public static synchronized void info(String nama){
f ( 5 ){ f ( 5 ){ for(int i=0; i<5; i++){ for(int i=0; i<5; i++){
try{ try{ Thread.sleep(1000); Thread.sleep(1000); }catch(InterruptedException ie){ }catch(InterruptedException ie){ System.out.println("Terinterupsi");} System.out.println("Terinterupsi");}yy p n np n n nn p );}p );} System.out.println("Thread" + nama + ": Posisi " +i);
System.out.println("Thread" + nama + ": Posisi " +i); }}}
Sinkronisasi
Sinkronisasi pada
pada method (ThreadBeraksi5.java)
method (ThreadBeraksi5.java)
h
k
h
k
b h
b h
hh
Pada
Pada ThreadBeraksi4.java,
ThreadBeraksi4.java, ubah
ubah method
method
run()
run() pada
pada class Mobil:
class Mobil:
public void run(){
public void run(){
pp
synchronized(this){
synchronized(this){
String
String nama
nama =
= getName
getName();
();
String
String nama
nama getName
getName();
();
SinkronisasiKeluaran.info(
SinkronisasiKeluaran.info(nama
nama);
);
}}}}
Prioritas
Prioritas Thread
Thread
Method
Method
setPriority
setPriority((int
int level)
level)
dapat
dapat dipanggil
dipanggil
hh
untuk
untuk menentukan
menentukan prioritas
prioritas dari
dari thread
thread
Nilai
Nilai level
level bisa
bisa berupa
berupa bilangan
bilangan bulat
bulat dari
dari
11--10
10
Nilai
Nilai level
level bisa
bisa berupa
berupa bilangan
bilangan bulat
bulat dari
dari
11 10
10
Prioritas
Prioritas
normal
normal
memiliki
memiliki nilai
nilai level
level
55
Perlu
Perlu dicatat
dicatat bahwa
bahwa
tidak
tidak semua
semua sistem
sistem operasi
operasi
mendukung
mendukung operasi
operasi ini
ini
, , sehingga
sehingga kadang
kadang
mend
ng
mend
ng pe asi
pe asi ini
ini
, , sehingga
sehingga adang
adang
pemanggilan
pemanggilan method
method ini
ini tidak
tidak memberikan
memberikan
efek
efek apa
apa apa
apa
efek
ThreadBeraksi6.java
ThreadBeraksi6.java
class Mobil extends Thread{ class Mobil extends Thread{ class Mobil extends Thread{ class Mobil extends Thread{ public Mobil(String id){ public Mobil(String id){
super(id); super(id); }}}}
public void run(){ public void run(){
String
String namagg nama = = getNamegetName();gg (); for(
for(intint ii=0; =0; ii<5; <5; ii++){++){
System.out.println
System.out.println(“Thread” + (“Thread” + namanama + “: + “: PosisiPosisi “ +“ +ii);); }}}
}}} }}} }}}
public class ThreadBeraksi6{ public class ThreadBeraksi6{
public static void main(String[]
public static void main(String[] argsargs){){
Mobil m1 = new Mobil(new Mobil(“M
Mobil m1 = new Mobil(new Mobil(“M--1”));1”)); Mobil m2 = new Mobil(new Mobil(“M
Mobil m2 = new Mobil(new Mobil(“M--2”));2”)); M bi m n w M bi (n w M bi ( M M bi m n w M bi (n w M bi ( M ));)); m2.setPriority(8); m2.setPriority(8); 1 t t() 2 t t() 1 t t() 2 t t() m1.start(); m2.start(); m1.start(); m2.start(); }} }}
I/O Stream
I/O Stream
I/O Stream
I/O Stream
Apa
Apa Itu
Itu I/O Stream
I/O Stream
Stream adalah
Stream adalah
proses membaca data dari
proses membaca data dari
tt
tt
bb (i
(i
t)
t) tt
suatu
suatu suatu
suatu sumber
sumber (input)
(input) atau
atau
mengirimkan
mengirimkan data
data ke
ke suatu
suatu tujuan
tujuan (output)
(output)
System.out.println
System.out.println()
() adalah
adalah contoh
contoh stream,
stream,
yang
yang berfungsi
berfungsi menampilkan
menampilkan data
data
yang
yang berfungsi
berfungsi menampilkan
menampilkan data
data
((informasi
informasi)
) ke
ke layar
layar
b l
b l
Variabel
Variabel standard stream:
standard stream:
System.in
System.in (default: keyboard)
y
y
n
n d a
(default: keyboard)
d a
y a d)
y a d)
System.out
System.out (default:
(default: layar
layar))
System err (default console)
System err (default console)
Konsep
Konsep
Jenis
Jenis I/O Stream
I/O Stream
1.1.
Byte Stream
Byte Stream
k
l
b
b
k
l
b
b
Untuk menulis atau membaca data biner
Untuk menulis atau membaca data biner
InputStream
InputStream dan
pp
dan OutputStream
OutputStream adalah
pp
adalah dua
dua class
class
abstrak
abstrak tertinggi
tertinggi dari
dari Byte Stream
Byte Stream
2.
2.
Character Stream
Character Stream
Untuk
Untuk menulis
menulis dan
dan membaca
membaca data
data karakter
karakter
((unicode
unicode)
)
Reader
Reader dan
dan Writer
Writer adalah
adalah dua
dua class
class abstrak
abstrak
tertinggi
1. Byte Stream
1. Byte Stream
Class
Class Turunan
Turunan Byte Stream
Byte Stream
Class
Class
Deskripsi
Deskripsi
BufferedInputStream
BufferedInputStream
p
p
BufferedOuputStream
BufferedOuputStream
ByteArrayInputStream
ByteArrayInputStream
ByteArrayOuputStream
ByteArrayOuputStream
DataInputStream
DataInputStream
DataOutputStream
DataOutputStream
FileInputStream
FileInputStream
Fil O
S
Fil O
S
FileOutputStream
FileOutputStream
PrintStream
PrintStream
Method Class
Method Class InputStream
InputStream
Method
Method
Deskripsi
Deskripsi
int
int available()
available()
()
()
void close()
void close()
void mark(
void mark(int
int readLimit
readLimit))
booleanmarkSupported
booleanmarkSupported()
()
int
int read()
read()
int
int read(byte[] b)
read(byte[] b)
int
int read(byte[] b,
read(byte[] b, int
int off,
off, int
int
len
len))
len
len))
void reset()
void reset()
long skip(long n)
long skip(long n)
g
g
p(
p(
g )
g )
Membaca
Membaca Input
Input dari
dari Console
Console
import java io *;
import java io *;
import java.io. ;
import java.io. ;
class
class InputStreamBeraksi
InputStreamBeraksi{{
class
class InputStreamBeraksi
InputStreamBeraksi{{
public static void main(String[]
public static void main(String[] args
args) throws
) throws IOException
IOException{{
byte[ ] data = new byte[10]
byte[ ] data = new byte[10]
byte[ ] data = new byte[10];
byte[ ] data = new byte[10];
System.out.println
System.out.println("
("Ketik
Ketik 10
10 buah
buah karakter
karakter:");
:");
System in read
System in read(data)
(data)
System.in.read
System.in.read(data);
(data);
S t
t p i tl
S t
t p i tl ("
("K kt
K kt
dd k tik
k tik d l h
d l h ")
")
System.out.println
System.out.println("
("Karakter
Karakter yang
yang anda
anda ketik
ketik adalah
adalah:");
:");
for(
for(int
int ii=0;
=0; ii<<data.length
data.length; ; ii++){
++){
S t
t i t
S t
t i t(( h ) d t [
(( h ) d t [ii])
])
System.out.print
System.out.print((char) data[
((char) data[ii]);
]);
}}
}}}}
}}
Membaca
Membaca Input
Input dari
dari File
File
import java.io.*; import java.io.*;pp jj ;; class
class FileInputStreamBeraksiFileInputStreamBeraksi{{
public static void main(String[]
public static void main(String[] argsargs) {) { if (
if (args.lengthargs.length==0) { ==0) { System.out.printlnSystem.out.println("("MasukkanMasukkan namanama file file sebagaisebagai parameter!"); }parameter!"); } if (
if (args.lengthargs.length 0) { 0) { System.out.printlnSystem.out.println(( MasukkanMasukkan namanama file file sebagaisebagai parameter! ); }parameter! ); } byte data;
byte data;
FileInputStream
FileInputStream fin=null;fin=null; try{
try{ try{ try{
fin = new
fin = new FileInputStreamFileInputStream((argsargs[0]);[0]); do{
do{
data = byte)
data = byte)fin readfin read();(); data byte)
data byte)fin.readfin.read();(); System.out.print
System.out.print((char)data);((char)data); }while(data!=
}while(data!=--1);1); }catch(
}catch(FileNotFoundExceptionFileNotFoundException e){e){ }catch(
}catch(FileNotFoundExceptionFileNotFoundException e){e){ System.out.println
System.out.println("File: " + ("File: " + argsargs[0] + "[0] + "tidaktidak ditemukanditemukan.");."); }catch(
}catch(IOExceptionIOException e){e){ System out println
System out println("("EkspresiEkspresi tidaktidak diketahuidiketahui " + e) " + e) System.out.println
System.out.println(( EkspresiEkspresi tidaktidak diketahuidiketahui : + e) ;: + e) ; }finally{ }finally{ if(fin!=null){ if(fin!=null){ t { t { fi lfi l ()() try{
try{ fin.closefin.close();(); }catch(
}catch(IOExceptionIOException err){ err){ System.out.printlnSystem.out.println("("EkspresiEkspresi tidaktidak diketahuidiketahui : " + err);}: " + err);} }}}}
Method Class
Method Class OutputStream
OutputStream
Method
Method DeskripsiDeskripsi
void close() void close() void flush() void flush() void write(byte[] b) void write(byte[] b) void write(byte[] b,
void write(byte[] b, intint off, off, intint lenlen)) abstract void write(
Menulis
Menulis Output
Output ke
ke Console
Console
imp rt ja a i *
imp rt ja a i *
import java.io.*;
import java.io.*;
l
l O t tSt
O t tSt
B k i
B k i{{
class
class OutputStreamBeraksi
OutputStreamBeraksi{{
public static void main(String[]
public static void main(String[] args
args) throws
) throws IOException
IOException{{
byte[] data = {'
byte[] data = {'a','b','c','d','e','f','g
a','b','c','d','e','f','g'};
'};
System.out.write
System.out.write(data,3,4);
(data,3,4);
System.out.write
System.out.write('
('\\n');
n');
System.out.write
System.out.write(data);
(data);
}}
}}
Menulis
Menulis Output
Output ke
ke File
File
import java.io.*; import java.io.*;pp jj class
class FileOutputStreamBeraksiFileOutputStreamBeraksi{{
public static void main (String[]
public static void main (String[] argsargs) {) { if (
if (args.lengthargs.length==0) {==0) {System.out.printlnSystem.out.println("Error: ("Error: tulistulis namanama file!");}file!");} byte data;
byte data; OutputStream
OutputStream foutfout=null;=null; try{
try{ fout
fout = new = new FileOutputStreamFileOutputStream((argsargs[0]);[0]); System.out.println
System.out.println ("("KetikKetik data yang data yang inginingin AndaAnda tulistulis keke file. Q file. Q untukuntuk berhentberhent");"); data = (byte)
data = (byte)System.in.readSystem.in.read();(); h l d b ) ) h l d b ) ) while(data!=(byte)'Q') { while(data!=(byte)'Q') { fout.write fout.write(data);(data); data = (byte)
data = (byte)System.in.readSystem.in.read();(); }}}}
}catch(
}catch(FileNotFoundExceptionFileNotFoundException e) {e) { System.out.println
System.out.println("file : " + ("file : " + argsargs[0] + " [0] + " tidaktidak dapatdapat dibukadibuka atauatau dibuatdibuat.");."); }catch(
}catch(IOExceptionIOException e) {e) { }catch(
}catch(IOExceptionIOException e) {e) { System.out.println
System.out.println("("EkspresiEkspresi tidaktidak diketahuidiketahui : " + e);: " + e); }finally {
}finally { if(
if(foutfout!=null) {!=null) { if(
if(foutfout! null) {! null) { try{
try{ fout.closefout.close();(); }catch(
Program Copy Isi File (Byte)
Program Copy Isi File (Byte)
t * t * import java.io.*; import java.io.*; public class
public class CopyBytesCopyBytes {{ pp py ypy y
public static void main(String[]
public static void main(String[] argsargs) throws ) throws IOExceptionIOException {{ FileInputStream
FileInputStream in = null; in = null; FileOutputStreamFileOutputStream out = null;out = null; try {
try { try { try {
in = new
in = new FileInputStreamFileInputStream("filesumber.txt");("filesumber.txt"); out = new
out = new FileOutputStreamFileOutputStream("filetujuan.txt");("filetujuan.txt"); int
int c;c;
while ((c =
while ((c = in.readin.read()) != ()) != --1) {1) { while ((c
while ((c in.readin.read()) ! ()) ! 1) {1) { out.write out.write(c); }(c); } } finally { } finally { f ( ! ll) { f ( ! ll) { if (in != null) { if (in != null) { in.close in.close(); }(); } if (out != null) { if (out != null) { out.close out.close(); }(); } }}} }}}
Proses
2. Character Stream
2. Character Stream
Class
Class Turunan
Turunan Character Stream
Character Stream
Class
Class
BufferedReader
BufferedReader
BufferedWrite
BufferedWrite
CharArrayReader
CharArrayReader
CharArrayWriter
CharArrayWriter
InputStreamReader
InputStreamReader
p
p
OutputStreamWriter
OutputStreamWriter
FileReader
FileReader
eReade
eReade
FileWriter
FileWriter
PrintWriter
PrintWriter
PrintWriter
PrintWriter
StringReader
StringReader
StringWriter
StringWriter
StringWriter
StringWriter
Method Class Reader
Method Class Reader
Method
Method
Deskripsi
Deskripsi
abstract void close()
abstract void close()
void mark(
void mark(int
int readAheadlimit
readAheadlimit
boolean
boolean markSupported
markSupported()
()
int
int read()
read()
int
int read(char[]
read(char[] cbuf
(
(
[]
[]
cbuf))
))
abstract
abstract int
int read(char[]
read(char[] cbuf
cbuf,,
int
int off,
off, int
int len
len))
void reset()
void reset()
long skip(long n)
long skip(long n)
g
g
p(
p(
g )
g )
Membaca Input dari Console (Karakter)
Membaca Input dari Console (Karakter)
t * t * import java.io.*; import java.io.*; class
class CharReaderBeraksiCharReaderBeraksi{{
public static void main(String[]
public static void main(String[] argsargs) throws ) throws IOExceptionIOException{{ char data; char data; String String strstr = ""= "" String String strstr = ;= ; BufferedReader
BufferedReader brbr = new = new BufferedReaderBufferedReader(new (new InputStreamReaderInputStreamReader((System.inSystem.in));)); System.out.println
System.out.println("("KetikKetik sejumlahsejumlah karakterkarakter, , akhiriakhiri dg Q");dg Q"); data =(char)
data =(char) br.readbr.read();(); while(data!='Q'){ while(data!='Q'){ while(data! Q ){ while(data! Q ){ str str += data;+= data; data = (char)
data = (char) br.readbr.read();(); }}}}
System.out.println
System.out.println("("KarakterKarakter yang yang andaanda ketikketik: " + : " + strstr);); }}
Membaca Input dari Console (Baris)
Membaca Input dari Console (Baris) --1
1--t * t * import java.io.*; import java.io.*; class
class LineReaderBeraksiLineReaderBeraksi{{
public static void main(String[]
public static void main(String[] argsargs) throws ) throws IOExceptionIOException{{ String
String hasilhasil = "";= ""; String
String strstr String String strstr;;
BufferedReader
BufferedReader brbr = new = new BufferedReaderBufferedReader(new (new InputStreamReaderInputStreamReader((System.inSystem.in));)); System.out.println
System.out.println("("KetikKetik sejumlahsejumlah string string dandan akhiriakhiri dengandengan KELUAR");KELUAR"); str
str = = br.readLinebr.readLine();(); while(!
while(!str.equalsstr.equals("KELUAR")){("KELUAR")){ while(!
while(!str.equalsstr.equals( KELUAR )){( KELUAR )){ hasil hasil += += strstr + '+ '\\n';n'; str str = = br.readLinebr.readLine();(); }}}} System.out.println System.out.println();(); System.out.println
System.out.println("String yang yy pp ("String yang andag y gg y g anda ketikketik: " + : " + hasilhasil);); }}
Method Class Writer
Method Class Writer
Method
Method
Deskripsi
Deskripsi
abstract void close()
abstract void close()
abstract void flush()
abstract void flush()
void write(char[]
void write(char[] cbuf
(
(
[]
[]
cbuf, , int
int off,
off, int
int len
len))
))
void write(
void write(int
int c)
c)
void write(String
void write(String str
str))
void write(String
void write(String str
str))
void write(String
Menulis
Menulis Output
Output ke
ke Console
Console
import java.io.*;
import java.io.*;
ll
class
class WriterBeraksi
WriterBeraksi{{
public static void main(String[]
public static void main(String[] args
args) throws
) throws IOException
IOException{{
PrintWriter
PrintWriter pw = new
pw = new PrintWriter
PrintWriter((System.out,true
System.out,true);
);
pw.println
pw.println("
("Menulis
Menulis ke
ke console
console dengan
dengan karakter
karakter stream");
stream");
}}
Menulis
Menulis Output
Output ke
ke File
File
t * t * import java.io.*; import java.io.*; class
class FileWriterBeraksiFileWriterBeraksi{{
public static void main (String[]
public static void main (String[] argsargs) {) {
ff ll hh ll ll f lf l if (
if (args.lengthargs.length==0){ ==0){ System.out.printlnSystem.out.println("Error: ("Error: tulistulis namanama file!");}file!");} String data;
String data; FileWriterFileWriter foutfout=null;=null; BufferedReader
BufferedReader brbr=new =new BufferedReaderBufferedReader(new (new InputStreamReaderInputStreamReader((System.inSystem.in));)); try{
try{ fout
fout = new = new FileWriterFileWriter((argsargs[0]);[0]); System.out.println
System.out.println("("KetikKetik data data keke file.Ketikfile.Ketik BERHENTI BERHENTI untukuntuk berhentiberhenti");"); data =
data = br.readLinebr.readLine();(); while(!
while(!data.equalsdata.equals("BERHENTI")) {("BERHENTI")) { fout.write
fout.write (data + "(data + "\\rr\\n");n"); data =
data = br.readLinebr.readLine();}();} }catch(
}catch(FileNotFoundExceptionFileNotFoundException e) {e) { System.out.println
System.out.println("File : " + yy pp ("File : " + argsargs[0] + " gg [0] + " tidaktidak dapatdapat dibukapp dibuka atauatau dibuatdibuat.");."); }catch(
}catch(IOExceptionIOException e) {e) {
System.out.println
System.out.println("("EkspresiEkspresi tidaktidak diketahuidiketahui : " + e);: " + e); }finally {
}finally {yy if(
if(foutfout!=null) { try{ !=null) { try{ fout.closefout.close();(); }catch(
}catch(IOExceptionIOException err) {err) { System.out.println