<< index           < bölüm 7          > bölüm 9        


  8.1 HATA ANALİZİ 473

8.2 ALIŞTIRMALAR


      8.        JAVADA HATA ANALİZİ VE YAKALANMASI

 

      8.1 HATA ANALİZİ  

 

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.

 

      8.2 ALIŞTIRMALAR

 

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şı