(ICT) Professionals Laboratuar Notları

advertisement
The European Union’s “Making the Labour Market more
Inclusive III” programme For “North Cyprus”
Upgrading Internet Technology skills
of Information and Communication
Technologies (ICT) Professionals
Module 2:Server Side Internet
Programming
Modül 2: Sunucu Tarafı Internet
Programlaması
Laboratuar Notları
A project implemented by
CyberSoft Bilişim Teknolojileri Ltd.
This project is funded by European Union. The contents
of this publication are the sole responsibility of
Cybersoft Bilişim Teknolojileri Ltd. and can in no way be
taken to reflect the views of the European Union.
İçerik
Bölüm 6: Hata Yakalama................................................................................................................2
Çalışma 1: Komplex Sayılar …………….................…….....………………………………….6
Çalışma 2: Zaman........................................ …………...………………………………………9
1
1. Hata Yakalama (Exception Handling)
Java’da error adı verilen hatalar meydana geldiğinde program akışı doğrudan sonlandırılmaktadır.
Ancak bazen, aslında derleme sırasında hata olduğu belli olmayan ancak çalısma zamanı sırasında
yapılan hatalı işlemler neticesinde ortaya çıkan hatalar olabilir.
1.1 Çalısma zamanı sırasında meydana gelen hatalar
Mesela program içerisinde “x/a” gibi bir ifade olduğunu varsayalım. Bu durumda program derlenirken,
bu ifade
hatalı olarak algılanmaz. Ancak program çalısırken a değiskenine 0 değeri atanırsa bu ifade
matematiksel olarak
sonsuz anlamına gelir ve bu da başka bir hata üretilmesine neden olur. İşte bu tür hatalara error değil
“exception” adı verilir.Exception ele alınabilir ama error alınamaz. Exception ile error kavramları
sadece tanım olarak değil, nitelik olarak da farklıdır. Çünkü java da exception’lar runtime sırasında
yakalanabilir. Ancak error olduğu zaman bu durum kesinlikle programın çalışmasını sonlandırır.
Exception’ların ele alınması
Exception, programda bazı özel bloklar içerisinde ele alınır. Programın çalısması sırasında bir
exception olursa hemen o anda bir “Exception” nesnesi yaratılır. Bu nesne, aslında Exception
nesnesinden türemiş bir başka exception da olabilir. Ama neticede en temel anlamda bir “Exception”
nesnesi yaratılır. Çalışma zamanı sırasında üretilen exception’lar ele alınabilir Daha sonra eğer
programcı tercih etmişse bu exception nesnesi özel bir blok tarafından yakalanır ve yine aynı bloklar
içerisinde programcının istedigi kodları çalıstırır.
try {
openFile();
readFile();
closeFile();
}
catch(Exception e)
{
doSomething();
}
Yukarıda da görüldügü gibi aslında exception’ların yakalanma prensibi, exception olma ihtimali olan
satırların bir try bloğu içerisinde yazılması ve meydana gelen exception’ı yakalayacak bir catch
bloğunun da hemen bu try bloklarının sonuna yerleştirilmesi şeklindedir.
Exception’lar Es Geçilemez
Exception’lar üretildiği anda programcı tarafından ele alınmazsa program exception ile birlikte
sonlanır. Bu nedenle bir exception ele alınmadan program akışına devam edilemez.
1.2 Kontrol edilen ve Kontrol Edilmeyen Exception’lar
Aslında Exception’lar kontrol edilen ve kontrol edilmeyen olmak üzere 2’ye ayrılır. Çalısma zamanı
sırasında meydana gelen bazı exceptionların kontrol edilmesi pogramcının isteğine bağlıdır. Bu tip
exception’lar “RunTimeException” nesnesinden türemişlerdir. Programcı bu exceptionları ele almazsa
program bir hata mesajı ile sonlanır. Ya da programcının ele aldığı şekilde akışına devam eder. (dizi
indeksinin geçilmesi, sıfıra bölme hatası )
Kontrol edilen exceptionların ele alınması prgoramcının isteğine bağlı degildir. Bu exception’ların
ele alınması zorunludur. Mesela bir dosyanın açılması okunması ya da kapanması işlemleri kontrol
edien exceptionlardır. Bu tür exception’lar programcının hatasından kaynaklanmayan exception’lardır
(Bozuk bir dosya ya da URL)
2
NOT: Aslında bütün exception’lar Throwable nesnesinden türemiştir.
3
Çalışma 1: Dizi Elemanlarına Ulaşma
Aşağıda verilen program şablonu hatasız çalışan bir Java programıdır. Ancak programdaki bir veya birden
fazla anahtar satırları açıklama satırlarıyla değiştirilmiştir. Problem tanımını okuyun ve örnek sonucu
inceleyin; daha sonra da şablon kod üzerinde çalışın. Problem çözme ipuçları’nı kullanarak /* */ gösterilen
açıklama satırlarını Java koduyla değiştirin. Programınızı derleyin ve çalıştırın. Bulduğunuz sonucu örnek
sonuçla karşılaştırın.
1.1 Dizi Elemanlarına Ulaşma Çalışmasının Amacı
Bu çalışmada şu konular incelenecektir:
 Girilen input değerinin uygunluğunun test edilmesi
 Hata-toleranslı program yazmak
 Kendi exception tipini yaratıp, bu tipde exceptionlar throw etme
1.2 Dizi Elemanlarına Ulaşma Çalışmasının Problem Tanımı
Kullanıcını, 10 elemanlı integer tipinde bir diziye input girip, dizi içerisinde arama yapabilmesini sağlayan
bir program yazınız. Program kullanıcının dizi içerisindeki değerleri indeksi ile alabilmesini veya dizide
girilen input değerinin nereye yerleştirileceğine karar verebilmesini sağlamalıdır. Eğer girilen input
değerlerinde bir sorun varsa veya diziye ulaşmada sorun yaşanılırsa, program exception vermelidir.
1. Eğer aranılan değer dizide bulunamıyorsa, NumberNotFoundException isimi exception throw
edilmelidir.
2. Eğer istenilen değer dizi sınırları dışındaysa, ArrayIndexOutOfBoundsException yakalanıp (catch),
ekrana uygun bir mesaj yazılmalıdır.
3. Eğer istenilen değer diziye daha eklenmemişse, program ArrayIndexOutOfBoundsException throw
etmelidir.
1.3 Dizi Elemanlarına Ulaşma Çalışmasının Örnek Program Çıktısı
4
1.4 Dizi Elemanlarına Ulaşma Çalışmasının Program Şablonu
// NumberNotFoundException.java
public class NumberNotFoundException extends Exception
{
public NumberNotFoundException()
{
super( "Number not found in array" );
}
public NumberNotFoundException( String message )
{
super( message );
}
} // end class NumberNotFoundException
Şekil 1.1 NumberNotFoundException.java
// ArrayAccess.java
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class ArrayAccess extends JFrame
{
private JTextField inputField;
5
private JTextField retrieveField1;
private JTextField retrieveField2;
private JTextField outputField;
private JPanel inputArea;
private JPanel retrieveArea;
private JPanel outputArea;
private int num;
private int index = 0;
private int array[] = new int[ 10 ];
private String result;
// set up GUI
public ArrayAccess()
{
super( "Accessing Array values" );
setLayout( new FlowLayout() );
// set up input Panel
inputArea = new JPanel();
inputArea.add( new JLabel( "Enter array elements here" ) );
inputField = new JTextField( 10 );
inputArea.add( inputField );
inputField.addActionListener(
new ActionListener()
{
public void actionPerformed( ActionEvent e )
{
/* Create a try block in which the application reads the number
entered in the inputField and assigns it to the next index
in the array, then increments instance variable index. */
/* Write catch handlers that catch the two types of exceptions
that the previous try block might throw (NumberFormatException
and ArrayIndexOutOfBoundsException), and display appropriate
messages in error message dialogs. */
inputField.setText( "" );
} // end method actionPerformed
} // end anonymous inner class
); // end call to addActionListener
// set up retrieve Panel
retrieveArea = new JPanel( new GridLayout( 2, 2 ) );
retrieveArea.add( new JLabel( "Enter number to retrieve" ) );
retrieveField1 = new JTextField( 10 );
retrieveArea.add( retrieveField1 );
retrieveField1.addActionListener(
new ActionListener()
{
6
public void actionPerformed( ActionEvent event )
{
/* Create a try block in which the application reads from
retrieveField1 the number the user wants to find in the
array, then searches the current array contents for the number.
If the number is found, the outputField should display all the
indices in which the number was found. If the number is not
found, a NumberNotFoundException should be thrown. */
/* Write catch handlers that catch the two types of exceptions that
the try block might throw (NumberFormatException and NumberNotFoundException), and display
appropriate messages in error message dialogs. */
retrieveField1.setText( "" );
} // end method actionPerformed
} // end anonymous inner class
); // end call to addActionListener
retrieveArea.add( new JLabel( "Enter index to retrieve" ) );
retrieveField2 = new JTextField( 10 );
retrieveArea.add( retrieveField2 );
retrieveField2.addActionListener(
new ActionListener()
{
public void actionPerformed( ActionEvent event )
{
/* Create a try block in which the application reads from retrieveField2 the index of a value in the array,
then displays the value at that index in the outputField. If the index input by the user is not a number a
NumberFormatException should be thrown. If the number input by the user is outside the array bounds or
represents an element in which the application has not stored a value, an
ArrayIndexOutOfBoundsException should be thrown. */
/* Write catch handlers that catch the two types of exceptions the try block might throw
(NumberFormatException and ArrayIndexOutOfBoundsException), and display appropriate
messages in error message dialogs. */
retrieveField2.setText( "" );
} // end anonymous inner class
} // end new ActionListener
); // end call to addActionListener
// set up output Panel
outputArea = new JPanel();
outputArea.add( new JLabel( "Result" ) );
outputField = new JTextField( 30 );
outputField.setEditable( false );
outputArea.add( outputField );
add( inputArea );
add( retrieveArea );
add( outputArea );
7
} // end constructor
} // end class ArrayAccess
Figure 1.2 ArrayAccess.java
// ArrayAccessTest.java
import javax.swing.JFrame;
public class ArrayAccessTest
{
// execute application
public static void main( String args[] )
{
ArrayAccess application = new ArrayAccess();
application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
application.setSize( 400, 200 );
application.setVisible( true );
}
} // end class ArrayAccessTest
Figure 1.3 ArrayAccessTest.java
1.5 Dizi Elemanlarına Ulaşma Calışmasıyla İlgili Problem Çözme İpuçları
1. Dizide bir eleman ararken, try blogundan önce boolean bir değişken tanımlayınız ve false değerine
eşitleyiniz.
2. 3 event handler’inde kendine ait try statement’i olmalıdır.
8
Çalışma 2.Exception Programındaki Hataları Bulma
Bu çalışmadaki program kodu hatalar içermektedir. Programın çalışabilmesi için bütün derleme hatalarını
düzeltiniz. Program derlendiğinde, programı çalıştırınız ve sonuçları örnek ekran çıktısıyla karşılaştırınız.
Daha sonra mantıksal hata varsa düzeltiniz. Program doğru şekilde çalıştığında sonuçlar aşağıdaki örnek
program çıktısı gibi olmalıdır.
2.1 Exception Çalışmasının Örnek Program Çıktısı
2.2 Hatalı Program Kodu
import java.io.IOException;
public class SpecialIOException throws IOException
{
public SpecialIOException()
{
super( "Special IO Exception Occurred" );
}
public SpecialIOException( String message )
{
this( message );
}
} // end class SpecialIOException
// Debugging Chapter 13: DebugException.java
import java.io.IOException;
public class DebugException
{
public static void main( String args[] )
{
try
{
throw new SpecialIOException();
}
catch ( Exception exception )
{
System.err.println( exception.toString() );
}
catch ( IOException ioException )
{
System.err.println( ioException.toString() );
}
9
catch ( SpecialIOException specialIOException )
{
specialIOException.toString();
} // end method main
} // end class DebugException
Çalışma 3. InvalidInputException Sınıfı Yazma
Exception sınıfının direk altkümesi olan InvalidInputException isimli bir sınıf tanımlayınız. “Yor input was
invalid.” İsimli bir mesaj tanımlamalıdır. Ama aynı zamanda programcının istediği mesajı da yazabilmesine
izin vermelidir.
10
Download