Javada diğer dillerden farklı olarak dil yapısının içinde hataları yakalamak için oldukça gelişmiş bir sistem mevcuttur. Eger javada kontrol edilmemiş bir hata oluşursa program durur ve hatayı yazar. Biz hata oluştuğunda hata kontrol sisteminde hatayı kontrol edip programı çalıştırmaya devam edebiliriz. Javadaki hata kontrol bloğu şu şekilde yazılır :
try
{ java deyimleri;
java kaynaklarından herhangi birini kullanan deyimler
}
catch( herhangibirtürException
e1)
{ exception kontrol deyimleri }
catch( diğerherhangibirtürException e1)
{ exception
kontrol deyimleri }
finally
{
deyimler
java kaynağını serbest bırakma deyimleri
}
Javadaki Exception türleri aşağıdaki tabloda verilmiştir :
Tablo 8.1 : Java hata ve exception listesi
Java.lang hata listesi
AbstractMethodError
ClassCircularityError
ClassFormatError
Error
ExceptionInInitializerError
IllegalAccessError
IncompatibleClassChangeError
InstantiationError
InternalError
LinkageError
NoClassDefFoundError
NoSuchFieldError
NoSuchMethodError
OutOfMemoryError
StackOverflowError
ThreadDeath
UnknownError
UnsatisfiedLinkError
VerifyError
VirtualMachineError
Java.lang Exception listesi
ArithmeticException
ArrayIndexOutOfBoundsException
ArrayStoreException
ClassCastException
ClassNotFoundException
CloneNotSupportedException
Exception
IllegalAccessException
IllegalArgumentException
IllegalMonitorStateException
IllegalStateException
IllegalThreadStateException
IndexOutOfBoundsException
InstantiationException
InterruptedException
NegativeArraySizeException
NoSuchFieldException
NoSuchMethodException
NullPointerException
NumberFormatException
RuntimeException
SecurityException
StringIndexOutOfBoundsException
Java.util exception listesi
EmptyStackException
MissingResourceException
NoSuchElementException
TooManyListenersException
Java.io exception listesi
CharConversionException
EOFException
FileNotFoundException
IOException
InterruptedIOException
InvalidClassException
InvalidObjectException
NotActiveException
NotSerializableException
ObjectStreamException
OptionalDataException
StreamCorruptedException
SyncFailedException
UTFDataFormatException
UnsupportedEncodingException
WriteAbortedException
Java hata oluştuğununda hatanın oluştuğu metotun girişinde kullanılan throws kelimesini takip eden Exception sınıfıyla aynı exception gurubunu yaşıyan try-catch gurubuna aktarır.
Bu metotun içinde gerekli noktada (hatanın oluşacağı şartda) throw deyimi kullanılarak hata oluştuğu aktarılır ve bu aktarım try-catch gurubu tarafından yakalanır ve işleme alınır.
Hata kontrolunu daha iyi açıklayabilmek amacıyla bir örnek vermek istiyoruz. SifiraBölünmeException sinifinda yeni bir hata kontrol sinifi yaratiyoruz. Bu sinif ve java kütüphanesinde mevcut olan tamsayı format hatası (NumberFormatException) sifirebolmetesti programında test edilmiştir. Sonuçlar applet çıktılarında görülmektedir. Eğer bu hatalar kontrol edilmeseydi, java programı hata vererek çalışmasını durdururdu.
Programdaki hata kontrol deyimleri kalın harfle verilmiştir. Hata kontrol
bloğu ise italik olarak verilmiştir.
Problem 8.1 sifiraBolunmeException.java programı, sısıra bolme hatası
tanımlar
public class sifiraBolunmeException
extends ArithmeticException
{
public sifiraBolunmeException()
{
super("sifira bolmeye calistiniz ");
}
}
Problem 8.2 Bizim tarafımızdan oluşturulan sifiraBolunmeException.java hata kontrolü ve sayı formatı hata kontrolü (NumberFormatException) yapan sifirabolmetesti.java programı
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.text.DecimalFormat;
import sifiraBolunmeException;
public class
sifirebolmetesti extends Applet implements ActionListener
{
private Label L1,L2;
private TextField T1,T2;
private int sayi1,sayi2;
private double sonuc;
public void init()
{
sayi1=0;
sayi2=1;
L1=new Label("Payi gir : ");
L2=new Label("Paydayi gir : ");
T1=new TextField(10);
T2=new TextField(10);
T2.addActionListener(this);
add(L1);
add(T1);
add(L2);
add(T2);
}
public double bol(int
s1,int s2) throws sifiraBolunmeException
{
if(s2==0) throw new sifiraBolunmeException();
return (double) s1/s2;
}
public void actionPerformed(ActionEvent
e)
{
DecimalFormat hassaslik3=new DecimalFormat("#.000");
try{
sayi1=Integer.parseInt(T1.getText());
sayi2=Integer.parseInt(T2.getText());
T1.setText("");
T2.setText("");
sonuc=bol(sayi1,sayi2);
showStatus(sayi1+" / "+sayi2+" = "+hassaslik3.format(sonuc));
}
catch(NumberFormatException nfe)
{showStatus("iki tam sayi girmelisiniz.");}
catch(sifiraBolunmeException sbh)
{showStatus(sbh.toString());}
}
}
08001.JPG, 08002.JPG,08003.JPG
Şekil 8.1-3 sıfırabolmetesti.html appletinde sıfıra bolme ve tamsayı
hata mesajlarının görünümü
Programlarda da görüldüğü gibi hata programın calismasına engel olmaksızın kullanıcıya bildirilmektedir. Bu program gurubunda once ArithmeticException sınıfından sıfıraBolunmeException sınıfı türetilmiştir. Sonra programın içindeki
public double bol(int
s1,int s2) throws sifiraBolunmeException
{
if(s2==0) throw new sifiraBolunmeException();
return (double) s1/s2;
}
metotunda metotun once throws sifiraBolunmeException deyimiyle exception gondereceği bildirilmiş, ve metotun içinde
if(s2==0) throw new sifiraBolunmeException();
deyimiyle exception ( hata değişkeni) gönderilmiştir. Gönderilen hata değişkeni (exception)
try{
sayi1=Integer.parseInt(T1.getText());
sayi2=Integer.parseInt(T2.getText());
T1.setText("");
T2.setText("");
sonuc=bol(sayi1,sayi2);
showStatus(sayi1+" / "+sayi2+" = "+hassaslik3.format(sonuc));
}
catch(NumberFormatException nfe)
{showStatus("iki tam sayi girmelisiniz.");}
catch(sifiraBolunmeException sbh)
{showStatus(sbh.toString());}
}
}
gurubu tarafından yakalanmış, ve eğer sıfır hatası varsa
catch(sifiraBolunmeException sbh) deyimi tarafından yakalanmiş ve
showStatus("iki tam sayi girmelisiniz."); işlemini çağırmıştı bu işlem sonunda applet sifiraBolunmeException sınıfının toString metotunu kullanarak
sifiraBolunmeException:sıfıra bolmeye calıstınız
mesajını vermiştir. Ayrıca yukardaki program parçacığında da görüldüğü gibi programımız aynı zamanda NumberFormatException nfe terimiyle integer olan rakamımızın integer olarak gönderilip gönderilmediğini kontrol etmektedir. Bu exception java kütüphanesindeki parsInt metotu tarafından gönderilmektedir.
1. H6O1java Hata (Exception) kontrolu programı. gercekSayiException ve bayagikesirException tanımlanmıştır.
gercekSayiException.java programınında gercek sayi girildiginde hata(Exception) vermek için gerceksayiException tanımlanmıştır. bayagikesir1.java programındaki
public bayagikesir(double
npay,double npayda) throws gercekSayiException
{
//*** tanimlayiniz
}
kurucu metotunu bu exception'i kullanacak şekilde oluşturunuz. H5O1.java programının benzeri H6O1.java programında bayagikesir yerine bayagikesir1 kullanarak exception yapinizi kontrol ediniz.
Problem 8.3 : gercekSayiException, gercek sayı hata tanım programı
public class gercekSayiException extends NumberFormatException
{
public gercekSayiException()
{
super("gercek sayi girdiniz tam sayi girmelisiniz");
}
}
Problem 8.4 : bayagikesirException , bayağı kesir sıfıra bölme hata tanım programı
class bayagikesirException extends Exception
{
public bayagikesirException()
{
super("Bayagi kesir paydasinin degeri 0.");
}
}
Problem 8.5 : bayagikesir1.java, hata kontrollü bayagikesir sınıfı
//===========================================
// bayagikesir sinifi tanimi
// Dr. Turhan Coban
//===========================================
import java.io.*;
import bayagikesirException;
import gercekSayiException;
// sinif bayagikesir
// bu sinif bayagikesir sayilarin matematik
// islemlerini tanimlar
//
class bayagikesir {
// sinif degiskenleri
int pay;
int payda;
// kurucu metodlar
public bayagikesir()
{
pay=0;
payda=1;
}
public bayagikesir(int npay,int npayda)
{
pay=npay;
payda=npayda;
}
public bayagikesir(double npay,double npayda) throws gercekSayiException
{
//*** tanimlayiniz
double tmp1,tmp2;
tmp1=(int)npay;
tmp2=(int)npayda;
if (tmp1!=npay) throw new gercekSayiException();
else if (tmp2!=npayda) throw new gercekSayiException();
else
{
pay=(int)tmp1;
payda=(int)tmp2;
}
}
public bayagikesir(int numer)
{
pay=numer;
payda=1;
}
public bayagikesir(bayagikesir c )
{
pay=c.Pay();
payda=c.Payda();
}
// giriŸ - ‡�k�Ÿ metotlar�
public int enbuyukortakbolen()
{
int n=pay;
int m=payda;
// iki tam sayinin en buyuk ortak bolenini hesaplar
if(n==0)
return m;
if(m==0)
return n;
while(m != n)
{
if(n>m)
n=n-m;
else
m=m-n;
}
return n;
}
public void sadelestir() throws bayagikesirException
{
//sadelestir
int isaret=1;
if(pay<0)
{
isaret=-isaret;
pay=-pay;
}
if(payda<0)
{
isaret=-isaret;
payda=-payda;
}
if(payda==0) {throw new bayagikesirException();}
int ebob=enbuyukortakbolen();
ebob=Math.abs(ebob);
pay=isaret*pay/ebob;
payda=payda/ebob;
}
public int Pay()
{
return pay;
}
public int Payda()
{
return payda;
}
public void payGir(int r)
{
pay=r;
}
public void paydaGir(int i)
{
payda=i;
}
public void bayagikesirGir(bayagikesir sag)
{
pay=sag.Pay();
payda=sag.Payda();
}
public void bayagikesirGir(int nr,int ni)
{
pay=nr;
payda=ni;
}
public void bayagikesirGir(int nr)
{
pay=nr;
payda=1;
}
public void bayagikesirGir(double d) throws bayagikesirException
{
// tam sayinin bayagikesir esitini y�kle
// eh birazc�k yaklas�m var tabi
bayagikesirGir((int)d*10000,10000);
sadelestir();
}
public double toDouble()
{
//bayagikesir sayinin gercek sayi esidi
return ((double)pay/(double)payda);
}
public static bayagikesir BayagikesireCevir(double d) throws bayagikesirException
{
// tam sayinin bayagikesir esiti
// eh birazc�k yaklas�m var tabi
bayagikesir b=new bayagikesir();
b.bayagikesirGir((int)d*10000,10000);
b.sadelestir();
return b;
}
public void topla(bayagikesir sag) throws bayagikesirException
{
//ikinci bir bayagikesirle topla
pay = pay*sag.Payda() + sag.Pay()*payda;
payda = payda*sag.Payda();
sadelestir();
}
public void topla(int sag) throws bayagikesirException
{
//bir gercek say�yla topla
pay = pay + sag*payda;
sadelestir();
}
public void cikar(bayagikesir sag) throws bayagikesirException
{
//ikinci bir bayagikesirle topla
pay = pay*sag.Payda() - sag.Pay()*payda;
payda = payda*sag.Payda();
sadelestir();
}
public void cikar(int sag) throws bayagikesirException
{
//bir gercek say�yla topla
pay = pay - sag*payda;
sadelestir();
}
public void carp(bayagikesir sag ) throws bayagikesirException
{
//bir bayagikesir sayiyla carp
pay = pay*sag.Pay();
payda = payda*sag.Payda();
sadelestir();
}
public void carp(int sag ) throws bayagikesirException
{
//bir gercek sayiyla carp
pay = pay*sag;
sadelestir();
}
public void bol(bayagikesir sag ) throws bayagikesirException
{
//bir bayagikesir say�yla bol
pay = pay*sag.Payda();
payda = payda*sag.Pay();
sadelestir();
}
public void bol(int sag ) throws bayagikesirException
{
//bir Pay say�yla bol
payda = payda*sag;
sadelestir();
}
public static bayagikesir topla(bayagikesir sol, bayagikesir sag) throws bayagikesirException
{
// iki bayagikesir say�n�n toplam�n� return deyimiyle bayagikesir olarak
// aktar�r
int r1= sol.Pay() * sag.Payda() + sag.Pay() * sol.Payda();
int i1= sol.Payda()* sag.Payda();
bayagikesir sonuc;
sonuc=new bayagikesir(r1,i1);
sonuc.sadelestir();
return sonuc;
}
public static bayagikesir topla(bayagikesir sol, int sag) throws bayagikesirException
{
// bir bayagikesir ve bir Pay say�n�n toplam�n� return deyimiyle bayagikesir olarak
// aktar�r
int r1=sol.Pay() + sag*sol.Payda();
int i1=sol.Payda();
bayagikesir sonuc;
sonuc=new bayagikesir(r1,i1);
sonuc.sadelestir();
return sonuc;
}
public static bayagikesir topla(int sol, bayagikesir sag) throws bayagikesirException
{
// bir bayagikesir ve bir Pay say�n�n toplam�n� return deyimiyle bayagikesir olarak
// aktar�r
int r1=sag.Pay() + sol*sag.Payda();
int i1=sag.Payda();
bayagikesir sonuc;
sonuc=new bayagikesir(r1,i1);
sonuc.sadelestir();
return sonuc;
}
//===================================
public static bayagikesir cikar(bayagikesir sol, bayagikesir sag) throws bayagikesirException
{
// iki bayagikesir say�n�n toplam�n� return deyimiyle bayagikesir olarak
// aktar�r
int r1= sol.Pay() * sag.Payda() - sag.Pay() * sol.Payda();
int i1= sol.Payda()* sag.Payda();
bayagikesir sonuc;
sonuc=new bayagikesir(r1,i1);
sonuc.sadelestir();
return sonuc;
}
public static bayagikesir cikar(bayagikesir sol, int sag) throws bayagikesirException
{
// bir bayagikesir ve bir Pay say�n�n toplam�n� return deyimiyle bayagikesir olarak
// aktar�r
int r1=sol.Pay() - sag*sol.Payda();
int i1=sol.Payda();
bayagikesir sonuc;
sonuc=new bayagikesir(r1,i1);
sonuc.sadelestir();
return sonuc;
}
public static bayagikesir cikar(int sol, bayagikesir sag) throws bayagikesirException
{
// bir bayagikesir ve bir Pay say�n�n toplam�n� return deyimiyle bayagikesir olarak
// aktar�r
int r1=sag.Pay() - sol*sag.Payda();
int i1=sag.Payda();
bayagikesir sonuc;
sonuc=new bayagikesir(r1,i1);
sonuc.sadelestir();
return sonuc;
}
//===================================
public static bayagikesir carp(bayagikesir sol, bayagikesir sag) throws bayagikesirException
{ // iki bayagikesir sayinin carpimini aktar
bayagikesir sonuc;
sonuc=new bayagikesir(sol.Pay()*sag.Pay(),sol.Payda()*sag.Payda());
sonuc.sadelestir();
return sonuc;
}
public static bayagikesir carp(bayagikesir sol, int sag) throws bayagikesirException
{ // bir bayagikesir ve bir double sayinin carpimini aktar
bayagikesir sonuc;
sonuc=new bayagikesir(sol.Pay()*sag,sol.Payda());
sonuc.sadelestir();
return sonuc;
}
public static bayagikesir carp(int sol, bayagikesir sag) throws bayagikesirException
{ // bir bayagikesir ve bir double sayinin carpimini aktar
bayagikesir sonuc;
sonuc=new bayagikesir(sag.Pay()*sol,sag.Payda());
sonuc.sadelestir();
return sonuc;
}
public static bayagikesir bol(bayagikesir sol, bayagikesir sag) throws bayagikesirException
{ // iki bayagikesir sayinin b”l�mlerini aktar
double a=sag.Pay()*sag.Pay()+sag.Payda()*sag.Payda();
bayagikesir sonuc;
sonuc=new bayagikesir((int)(sol.Pay()*sag.Payda()),(int)(sol.Payda()*sag.Pay()));
sonuc.sadelestir();
return sonuc;
}
public static bayagikesir bol(bayagikesir sol, int sag) throws bayagikesirException
{ // bayagikesir say�y� double say�ya bol
bayagikesir sonuc;
sonuc=new bayagikesir(sol.Pay(),(sol.Payda()*sag));
sonuc.sadelestir();
return sonuc;
}
public boolean kucuktur(bayagikesir sol,bayagikesir sag)
{
// less then comparison of two bayagikesir numbers
return (sol.toDouble() < sag.toDouble());
}
public boolean kucuktur_esittir(bayagikesir sol,bayagikesir sag)
{
// less then and esittir comparison of two bayagikesir numbers
return (sol.toDouble() <= sag.toDouble());
}
public boolean buyuktur(bayagikesir sol,bayagikesir sag)
{
// buyuktur then comparison of two bayagikesir numbers
return sol.toDouble() > sag.toDouble();
}
public boolean buyuktur_esittir(bayagikesir sol,bayagikesir sag)
{
// buyuktur then and esittir comparison of two bayagikesir numbers
return sol.toDouble() >= sag.toDouble();
}
public boolean esittir(bayagikesir sol,bayagikesir sag)
{
// esittir comparison of two bayagikesir numbers
return sol.toDouble() == sag.toDouble();
}
public boolean esit_degildir(bayagikesir sol,bayagikesir sag)
{
// not esittir comparison of two bayagikesir numbers
return sol.toDouble() != sag.toDouble();
}
public static String toString(bayagikesir value)
{
String b="";
if(Math.abs(value.Payda())!=1)
{
b=b+"( "+value.Pay()+" / "+value.Payda()+" )";
}
else
{
b=b+value.Pay()+" ";
}
return b;
}
public String toString()
{
// yazima haz�r bayagikesir formda String de§iskeni iletir.
String b="";
if(Math.abs(Payda())!=1)
{
b=b+"( "+pay+" / "+Payda()+" )";
}
else
{
b=b+Pay()+" ";
}
return b;
}
};
//bayagikesir sinifinin taniminin sonu
Problem 8.6 : bayagikesirException, bayağı kesir sıfıra bölme hata test programı
H6O1.java
/bu sinif sinif degiskeni kompleksi boyutlu olarak çcagirir.
//not buradaki bayagikesir sinifi bayagikesir1.java programi
//tarafindan yaratilmistir.
import java.io.*; //java girdi cikti sinifini cagir
import bayagikesir;
class H6O1
{
public static void main(String args[]) throws IOException
{
Text cin=new Text();
double n1,n2;
System.out.print("toplam bayagi kesir sayisi, n = ");
int n=cin.readInt();
bayagikesir sayi[]=new bayagikesir[n];
bayagikesir toplam=new bayagikesir();
int i;
for(i=0;i<sayi.length;i++)
{
try{
System.out.print("bir bayagikesir giriniz : ");
n1=cin.readDouble();
n2=cin.readDouble();
sayi[i]=new bayagikesir(n1,n2);
}
catch (gercekSayiException e)
{
System.err.println(e.getMessage());
i--;
}
}
for(i=0;i<sayi.length;i++)
{
try{
toplam.topla(sayi[i]);
}
catch (bayagikesirException e)
{
System.err.println(e.getMessage());
}
}
System.out.println("Toplam = "+toplam.toString());
try{
toplam.bol(sayi.length);
}
catch (bayagikesirException e)
{
System.err.println(e.getMessage());
}
System.out.println("Ortalama = "+toplam.toString());
}
}
2. H8AL1_2000, Bayagikesir hata kontrolu programı çıktısı, JoptionPane kullanıyor.
import javax.swing.JOptionPane;
import java.io.*; //java girdi cikti sinifini cagir
import bayagikesir;
class H8AL1_2000
{
public static void main(String args[]) throws IOException
{
Text cin=new Text();
double n1,n2;
System.out.print("toplam bayagi kesir sayisi, n = ");
int n=cin.readInt();
bayagikesir sayi[]=new bayagikesir[n];
bayagikesir toplam=new bayagikesir();
int i;
String s="";
for(i=0;i<sayi.length;i++)
{
try{
System.out.print("bir bayagikesir giriniz : ");
n1=cin.readDouble();
n2=cin.readDouble();
sayi[i]=new bayagikesir(n1,n2);
}
catch (gercekSayiException e)
{
JOptionPane.showMessageDialog(null,e.getMessage(),"Gerçek Sayı Hatası",
JOptionPane.ERROR_MESSAGE);
i--;
}
catch (bayagikesirException e)
{
JOptionPane.showMessageDialog(null,e.getMessage(),"Bayağı kesir Hatası",
JOptionPane.ERROR_MESSAGE);
}
}
for(i=0;i<sayi.length;i++)
{
try{
toplam.topla(sayi[i]);
}
catch (bayagikesirException e)
{
JOptionPane.showMessageDialog(null,e.getMessage(),"Bayağı kesir Hatası",
JOptionPane.ERROR_MESSAGE);
}
}
s+="Ortalama = "+toplam.toString();
try{
toplam.bol(sayi.length);
}
catch (bayagikesirException e)
{
JOptionPane.showMessageDialog(null,e.getMessage(),"Bayağı kesir Hatası",
JOptionPane.ERROR_MESSAGE);
}
s+="Ortalama = "+toplam.toString();
JOptionPane.showMessageDialog(null,s,
"Bayağı kesir Ortalaması",JOptionPane.PLAIN_MESSAGE);
System.exit(0);
}
}
<< index
< bölüm 7
> bölüm 9
bölüm başı