Friday, October 22, 2010

Checked Exceptions And Runtime Exceptions.

Soru
Iyi gunler arkadaslar asagidaki soruyla karsilastiktan sonra exception'lar ile ilgili ogrenmem gereken birsey oldugunu gordum sorum su kontrol edilebilen hatalar ve calisma zamani verilen hatalar var. bir cok exception sinifi var ve ben hagisi runtime exception hangisi checked exception oldugunu nasil anlayabilirim mesala biiyorumki

FileInputStream fis= new FileInputStream("dememe.txt");

sinifi icin FileNotFoundException sinifi checked exception dir.

Yani benim bu Exception siniflarini tek tek bilmeliyimki hangisi checked exception hangisi runtime exception oldugunu yoksa ayird edilebilecek birsey varmi yardimci olabilirmisiniz

Which of the following are checked exceptions?

a) IllegalThreadStateException

b) IllegalMonitorStateException

c) ParseException

d) NumberFormatException

e) IOException

f) RuntimeException

g) ClassNotFoundException

cevap c , e , g



Hayirli gunler


Cevap veren Gökalp Gürbüzer JTPD sayfasindan
http://www.jtpd.org/talks/5378557

Java'daki aykırı durumları (exception) "kontrol edilebilir"/"çalışma zamanı" olarak ayırmak biraz kafa karıştırıcı geliyor; çünkü aykırı durumların tamamı çalışma zamanında geldiği aşikar. Aslında "Runtime Exception" olarak anılan aykırı durumlar java.lang.RuntimeException sınıfından türeyen aykırı durumlardır. "Runtime Exception"lar, JVM'in karşılaştığı aykırı durumlardır; daha doğrusu JVM ile işletim sistemi arasındaki iletişim sırasında ortaya çıkan aykırı durumlardır. RuntimeException sınıfından türemeyen ama Exception sınıfından türeyen bütün aykırı durumlar "Checked Exception" olarak adlandırılır ve JVM üzerinde çalışan program akışının denetiminde olan durumları kapsar.

Bu yüzden "Checked/Runtime Exception" ayrımı için belki de "Normal/JVM Aykırı Durumu" çevirmesi daha doğru olabilir.

Normal/JVM aykırı durumlarını genel olarak ayırabilmek için de aykırı durumun hangi durumda fırlatılabildiğini tahmin etmek bir yöntem olarak uygulanabilir. Örnek sorudaki "ParseException" verilen bir metnin ayıklanamadığı (parse) durumlarda fırlatıldığını biliyorsak "JVM ile ilgisi yoktur, o zaman normal aykırı durumdur" dememiz mümkün. Keza IOException da bir dosyanın bulunmaması ya da okunamaması, ya da bir sokete bağlanılamadığı zaman karşımıza çıktığına göre "JVM değildir, o zaman normal aykırı durumdur" diyebiliriz. Son olarak da ClassNotFoundException bir sınıfın adını verip sınıfı çağırmaya çalıştığımızda karşımıza geldiğine göre "JVM değildir, o zaman normal aykırı durumdur" denilebilir.

Diyeceksiniz ki "IOException'ın nasıl olur da JVM ile ilgisi olmaz?". Yanıtı şu: JVM, işletim sistemine "ben bu G/Ç işini yapacağım" demiş ve işletim sistemi "olmaz kardeşim, izin vermiyorum/yapamazsın" demiştir. Yani arada iletişim sağlanmış, ama JVM olumsuz yanıt almıştır. Bu bir JVM aykırı durumu değildir, JVM bu yanıtı bize bildirmektedir yalnızca. Eğer işletim sistem ile iletişim sağlayamasa idi bir JVM aykırı durumu fırlatılacaktı.

Aynı mantıkla diğer yanıtlardan IllegalThreadState ve IllegalMonitorState "JVM ile ilgilidir" diye düşünülüp JVM aykırı durumu olduğu söylenebilir. f şıkkında verilen RuntimeException zaten JVM aykırı durumlarının türediği nesne olduğu için en kolay ayırt edilebilecek şık.

Bu sorudaki asıl zor nokta d şıkkında: NumberFormatException. Bu aykırı durum RuntimeException'dan türeyen "IllegalArgumentException" sınıfından türer ve IllegalArgumenException da bir yordama normalde verilmemesi gereken bir parametre ile gidildiğinde alınan bir aykırı durumu belirtir. Bence IllegalArgumenException'un JVM aykırı durumu olduğu tahmin edilebilir, ancak NumberFormatException için durum böyle değil malesef.

Biraz uzun oldu sanırım ama, kıssadan hisse olarak ayrımı şöyle yapabiliriz:

Eğer aykırı durum JVM'e değen bir satırdan gelmiş ise JVM aykırı durumudur. Eğer aykırı durum JVM'in üst katmanlarında çalışan koddan geldiyse normal aykırı durumdur.

JVM'e değen satırlar ise bellek, iş (process) ve iplik (thread) ile ilgili satırlardır.

Bu açıdan bakıp biraz JavaDoc kurcalamak sanırım bu ayrımı gözümüz kapalı yapmayı sağlayacaktır.


Benim sonrada eklediklerim 
 

java.lang.RuntimeException sinifindan tureyan siniflar ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException

java.lang.Exception sinifindan tureyan siniflar  
AclNotFoundException, ActivationException, AlreadyBoundException, ApplicationException, AWTException, BackingStoreException, BadLocationException, CertificateException, ClassNotFoundException, CloneNotSupportedException, DataFormatException, DestroyFailedException, ExpandVetoException, FontFormatException, GeneralSecurityException, GSSException, IllegalAccessException, InstantiationException, InterruptedException, IntrospectionException, InvalidMidiDataException, InvalidPreferencesFormatException, InvocationTargetException, IOException, LastOwnerException, LineUnavailableException, MidiUnavailableException, MimeTypeParseException, NamingException, NoninvertibleTransformException, NoSuchFieldException, NoSuchMethodException, NotBoundException, NotOwnerException, ParseException, ParserConfigurationException, PrinterException, PrintException, PrivilegedActionException, PropertyVetoException, RefreshFailedException, RemarshalException, RuntimeException, SAXException, ServerNotActiveException, SQLException, TooManyListenersException, TransformerException, UnsupportedAudioFileException, UnsupportedCallbackException, UnsupportedFlavorException, UnsupportedLookAndFeelException, URISyntaxException, UserException, XAException 
 

No comments:

Post a Comment