Saturday 26 September 2015

exception(pengecualian) di java

Pengecualian (atau peristiwa luar biasa) adalah masalah yang timbul selama pelaksanaan program. Ketika sebuah Exception terjadi aliran normal program terganggu dan program / aplikasi berakhir abnormal, yang tidak dianjurkan, karena itu pengecualian ini harus ditangani.

Pengecualian dapat terjadi karena berbagai alasan yang berbeda, di bawah ini diberikan adalah beberapa skenario di mana pengecualian terjadi.

Seorang pengguna telah memasuki data yang tidak valid.

Sebuah file yang perlu dibuka tidak dapat ditemukan.

Koneksi jaringan telah hilang di tengah-tengah komunikasi atau JVM telah kehabisan memori.

Beberapa pengecualian ini disebabkan oleh kesalahan pengguna, orang lain dengan kesalahan programmer, dan lain-lain oleh sumber daya fisik yang telah gagal dalam beberapa cara.

Berdasarkan ini kami memiliki tiga kategori Pengecualian Anda perlu memahami mereka untuk mengetahui bagaimana penanganan eksepsi bekerja di Java,

Pengecualian diperiksa: Sebuah pengecualian diperiksa adalah pengecualian yang terjadi pada waktu kompilasi, ini juga disebut sebagai pengecualian waktu kompilasi. Pengecualian ini tidak bisa hanya diabaikan pada saat kompilasi, Programmer harus mengurus (handle) pengecualian.

Misalnya, jika Anda menggunakan kelas FileReader dalam program Anda untuk membaca data dari sebuah file, jika file yang ditentukan dalam konstruktor tidak ada, maka FileNotFoundException terjadi, dan compiler meminta programmer untuk menangani pengecualian.

import java.io.File;
import java.io.FileReader;

public class FilenotFound_Demo {

   public static void main(String args[]){  
      File file=new File("E://file.txt");
      FileReader fr = new FileReader(file); 
   }
   
}

Jika Anda mencoba untuk mengkompilasi program di atas Anda akan mendapatkan pengecualian seperti yang ditunjukkan di bawah ini.

C:\>javac FilenotFound_Demo.java
FilenotFound_Demo.java:8: error: unreported exception FileNotFoundException; must be caught or declared to be thrown
      FileReader fr = new FileReader(file);
                      ^
1 error

Catatan: Sejak metode read () dan close () dari kelas FileReader throws IOException, Anda dapat mengamati compiler yang memberitahukan untuk menangani IOException, bersama dengan FileNotFoundException.

Pengecualian dicentang: Pengecualian dicentang adalah pengecualian yang terjadi pada saat eksekusi, ini juga disebut sebagai Runtime Pengecualian, ini termasuk bug pemrograman, seperti kesalahan logika atau penggunaan yang tidak benar dari API. pengecualian runtime diabaikan pada saat kompilasi.

Misalnya, jika Anda telah menyatakan sebuah array dari ukuran 5 dalam program Anda, dan mencoba untuk memanggil elemen 6 dari array maka ArrayIndexOutOfBoundsExceptionexception terjadi.

public class Unchecked_Demo {
   
   public static void main(String args[]){
      int num[]={1,2,3,4};
      System.out.println(num[5]);
   }

}

Jika Anda mengkompilasi dan menjalankan program di atas Anda akan mendapatkan pengecualian seperti yang ditunjukkan di bawah ini.

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
 at Exceptions.Unchecked_Demo.main(Unchecked_Demo.java:8)

Kesalahan: Ini bukan pengecualian sama sekali, tapi masalah yang timbul di luar kendali pengguna atau programmer. Kesalahan biasanya diabaikan dalam kode Anda karena Anda jarang bisa berbuat apa-apa kesalahan. Sebagai contoh, jika stack overflow terjadi, kesalahan akan muncul. Mereka juga diabaikan pada saat kompilasi.

Pengecualian Hierarchy:
Semua kelas pengecualian adalah subtipe dari kelas java.lang.Exception. Kelas pengecualian adalah subclass dari kelas Throwable. Selain kelas pengecualian ada subclass lain yang disebut Kesalahan yang berasal dari kelas Throwable.

Kesalahan biasanya tidak terjebak membentuk program Java. Kondisi ini biasanya terjadi dalam kasus kegagalan yang parah, yang tidak ditangani oleh program java. Kesalahan yang dihasilkan untuk menunjukkan kesalahan yang dihasilkan oleh lingkungan runtime. Contoh: JVM adalah dari Memory. Biasanya program tidak dapat pulih dari kesalahan.

Kelas Exception memiliki dua subclass utama: kelas IOException dan RuntimeException Class.



Java mendefinisikan beberapa kelas pengecualian dalam paket java.lang standar.

Yang paling umum dari pengecualian ini adalah subclass dari tipe standar RuntimeException. Sejak java.lang secara implisit diimpor ke semua program Java, yang paling pengecualian berasal dari RuntimeException secara otomatis tersedia.

Java mendefinisikan beberapa jenis lain dari pengecualian yang berhubungan dengan berbagai perpustakaan kelasnya. Berikut adalah daftar Java dicentang RuntimeException.


Error
ArithmeticException Aritmatika, seperti membagi-by-nol.

Indeks Array

ArrayIndexOutOfBoundsException adalah out-of-batas.

ArrayStoreException
Penugasan ke elemen array dari jenis yang tidak kompatibel.

ClassCastException
tidak valid cor.

IllegalArgumentException argumen ilegal
digunakan untuk memanggil sebuah metode.

IllegalMonitorStateException
operasi memantau Illegal, seperti menunggu di thread terkunci.

IllegalStateException
Lingkungan atau aplikasi dalam keadaan tidak benar.

IllegalThreadStateException
Diminta operasi tidak kompatibel dengan keadaan thread saat ini.

IndexOutOfBoundsException
Beberapa jenis indeks adalah out-of-batas.

NegativeArraySizeException
Array dibuat dengan ukuran negatif.

NullPointerException
penggunaan tidak valid dari referensi null.

Konversi NumberFormatException
tidak valid dari string ke format numerik.

SecurityException
Mencoba untuk melanggar keamanan.

StringIndexOutOfBounds
Mencoba untuk indeks di luar batas string.

UnsupportedOperationException
Operasi tidak didukung ditemui.
Berikut ini adalah daftar Pengecualian Java Diperiksa Ditetapkan di java.lang.

ClassNotFoundException
Kelas tidak ditemukan.

CloneNotSupportedException
Mencoba untuk mengkloning sebuah benda yang tidak mengimplementasikan antarmuka Cloneable.

IllegalAccessException
Akses ke kelas ditolak.

InstantiationException
Mencoba untuk menciptakan sebuah objek dari kelas abstrak atau antarmuka.

InterruptedException
Satu benang telah terganggu oleh thread lain.

NoSuchFieldException
A diminta lapangan tidak ada. Metode tidak ada NoSuchMethodException A diminta.

 Metode exception:
Berikut ini adalah daftar medthods penting tersedia di kelas Throwable.


1 public String getMessage ()
Mengembalikan pesan rinci tentang pengecualian yang telah terjadi. Pesan ini diinisialisasi dalam konstruktor Throwable.

2 publik Throwable getCause ()
Mengembalikan penyebab pengecualian yang diwakili oleh benda Throwable.

3 public String toString ()
Mengembalikan nama kelas bersambung dengan hasil getMessage ()

4 public void printStackTrace ()
Mencetak hasil toString () bersama dengan jejak stack untuk System.err, output stream kesalahan.

5 publik StackTraceElement [] getStackTrace ()
Mengembalikan array yang berisi setiap elemen pada jejak stack. Elemen pada indeks 0 mewakili atas panggilan stack, dan elemen terakhir dalam array mewakili metode di bawah panggilan stack.

6 fillInStackTrace Throwable publik ()
Mengisi jejak stack objek Throwable ini dengan tumpukan saat jejak, menambah informasi sebelumnya dalam jejak stack.

Penangkapan Pengecualian:
Sebuah metode menangkap pengecualian menggunakan kombinasi dari mencoba dan menangkap kata kunci. Sebuah blok try / catch ditempatkan di sekitar kode yang mungkin menghasilkan pengecualian. Kode dalam blok try / catch disebut sebagai kode dilindungi, dan sintaks untuk menggunakan try / catch terlihat seperti berikut:

try
{
   //Protected code
}catch(ExceptionName e1)
{
   //Catch block
}

Kode yang rentan terhadap pengecualian ditempatkan di blok try, ketika pengecualian terjadi, pengecualian yang terjadi ditangani oleh menangkap blok yang terkait dengan itu. Setiap mencoba blok harus segera diikuti baik oleh blok kelas atau akhirnya blok.

Sebuah pernyataan menangkap melibatkan menyatakan jenis pengecualian Anda mencoba untuk menangkap. Jika pengecualian terjadi dalam kode yang dilindungi, blok catch (atau blok) yang mengikuti try tersebut akan diperiksa. Jika jenis pengecualian yang terjadi tercantum dalam blok catch, pengecualian akan diteruskan ke blok catch sebanyak argumen dilewatkan ke parameter metode.

contoh:
Berikut ini adalah sebuah array dideklarasikan dengan 2 elemen. Kemudian kode mencoba untuk mengakses elemen 3 dari array yang melempar pengecualian.

// File Name : ExcepTest.java
import java.io.*;
public class ExcepTest{

   public static void main(String args[]){
      try{
         int a[] = new int[2];
         System.out.println("Access element three :" + a[3]);
      }catch(ArrayIndexOutOfBoundsException e){
         System.out.println("Exception thrown  :" + e);
      }
      System.out.println("Out of the block");
   }
}

akan menghasilkan :

Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
Out of the block

Beberapa Blok catch:
Blok try dapat diikuti oleh beberapa blok catch. Sintaks untuk beberapa blok catch terlihat seperti berikut:

try
{
   //Protected code
}catch(ExceptionType1 e1)
{
   //Catch block
}catch(ExceptionType2 e2)
{
   //Catch block
}catch(ExceptionType3 e3)
{
   //Catch block
}

Laporan sebelumnya menunjukkan tiga blok menangkap, tetapi Anda dapat memiliki sejumlah dari mereka setelah dicoba tunggal. Jika pengecualian terjadi dalam kode dilindungi, pengecualian dilemparkan ke blok catch pertama dalam daftar. Jika jenis data pengecualian dilemparkan cocok ExceptionType1, itu tertangkap di sana. Jika tidak, terkecuali melewati ke pernyataan menangkap kedua. Ini berlanjut sampai pengecualian baik tertangkap atau jatuh melalui semua tangkapan, dalam hal metode saat berhenti eksekusi dan pengecualian dilemparkan ke metode sebelumnya pada panggilan stack.

contoh:
Berikut adalah segmen kode yang menunjukkan bagaimana menggunakan beberapa pernyataan try / catch.

try
{
   file = new FileInputStream(fileName);
   x = (byte) file.read();
}catch(IOException i)
{
   i.printStackTrace();
   return -1;
}catch(FileNotFoundException f) //Not valid!
{
   f.printStackTrace();
   return -1;
}

Penangkapan jenis beberapa pengecualian
Sejak Java 7 Anda dapat menangani lebih dari satu pengecualian menggunakan menangkap blok tunggal, fitur ini menyederhanakan kode. Dibawah ini adalah sintaks penulisan

catch (IOException|FileNotFoundException ex) {
   logger.log(ex);
   throw ex;

Melempar Kata Kunci / membuang:
Jika metode tidak menangani pengecualian diperiksa, metode harus menyatakan dengan menggunakan kata kunci melempar. Melempar kata kunci muncul pada akhir tanda tangan metode ini.

Anda bisa melempar pengecualian, baik yang baru dipakai satu atau pengecualian yang baru saja Anda tertangkap, dengan menggunakan lemparan kata kunci.

Cobalah untuk memahami perbedaan antara melempar dan kata kunci lemparan, lemparan digunakan untuk menunda penanganan pengecualian diperiksa dan melemparkan digunakan untuk memohon pengecualian eksplisit.
Metode berikut menyatakan bahwa itu melontarkan RemoteException a:

import java.io.*;
public class className
{
   public void deposit(double amount) throws RemoteException
   {
      // Method implementation
      throw new RemoteException();
   }
   //Remainder of class definition
}

Sebuah metode dapat menyatakan bahwa itu melontarkan lebih dari satu pengecualian, dalam hal ini pengecualian dinyatakan dalam daftar dipisahkan dengan koma. Sebagai contoh, metode berikut mendeklarasikan bahwa itu membuat RemoteException dan InsufficientFundsException:

import java.io.*;
public class className
{
   public void withdraw(double amount) throws RemoteException,
                              InsufficientFundsException
   {
       // Method implementation
   }
   //Remainder of class definition
}

Akhirnya blok
Akhirnya blok berikut blok try atau catch blok. Sebuah akhirnya blok kode selalu mengeksekusi, terlepas dari terjadinya suatu Exception.

Menggunakan akhirnya blok memungkinkan Anda untuk menjalankan pernyataan pembersihan-jenis yang ingin Anda jalankan, apa pun yang terjadi dalam kode dilindungi.

Sebuah blok akhirnya muncul pada akhir blok menangkap dan memiliki sintaks berikut:

try
{
   //Protected code
}catch(ExceptionType1 e1)
{
   //Catch block
}catch(ExceptionType2 e2)
{
   //Catch block
}catch(ExceptionType3 e3)
{
   //Catch block
}finally
{
   //The finally block always executes.
}

contoh :

public class ExcepTest{

   public static void main(String args[]){
      int a[] = new int[2];
      try{
         System.out.println("Access element three :" + a[3]);
      }catch(ArrayIndexOutOfBoundsException e){
         System.out.println("Exception thrown  :" + e);
      }
      finally{
         a[0] = 6;
         System.out.println("First element value: " +a[0]);
         System.out.println("The finally statement is executed");
      }
   }
}

akan menghasilkan :

Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3
First element value: 6
The finally statement is executed

Perhatikan hal berikut:

Sebuah klausa catch tidak bisa ada tanpa pernyataan try.

Hal ini tidak wajib untuk memiliki akhirnya klausa ketika pernah blok try / catch hadir.

Coba block tidak dapat hadir tanpa baik catch klausa atau klausa akhirnya.

Kode tidak bisa hadir di antara mencoba, menangkap, akhirnya blok.

Sumber daya mencoba-dengan-
Umumnya ketika kita menggunakan sumber seperti sungai, koneksi dll .. kita harus menutup mereka secara eksplisit menggunakan akhirnya blok. Dalam program ini diberikan di bawah ini kita membaca data dari file menggunakan FileReader dan kami menutupnya menggunakan akhirnya blok.

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class ReadData_Demo {

   public static void main(String args[]){
      FileReader fr=null;  
      try{
         File file=new File("file.txt");
         fr = new FileReader(file);  char [] a = new char[50];
         fr.read(a); // reads the content to the array
         for(char c : a)
         System.out.print(c); //prints the characters one by one
      }catch(IOException e){
          e.printStackTrace();
       }
       finally{ 
          try{
              fr.close();
          }catch(IOException ex){  
               ex.printStackTrace();
           }
       }
    }

}

mencoba-dengan-sumber daya, juga disebut sebagai manajemen sumber daya otomatis. adalah mekanisme penanganan eksepsi baru yang diperkenalkan di Java7, yang secara otomatis menutup sumber daya yang digunakan dalam mencoba menangkap blok.

Untuk menggunakan pernyataan ini Anda hanya perlu menyatakan sumber daya yang diperlukan dalam kurung, sumber daya dibuat akan ditutup secara otomatis pada akhir blok, di bawah ini diberikan adalah sintaks sumber daya mencoba-dengan-pernyataan.

try(FileReader fr=new FileReader("file path"))
   {
   //use the resource
   }catch(){
      //body of catch 
    }
   }

Dibawah ini adalah program yang membaca data dalam file menggunakan sumber daya mencoba-dengan-pernyataan.

import java.io.FileReader;
import java.io.IOException;

public class Try_withDemo {

   public static void main(String args[]){
        
      try(FileReader fr=new FileReader("E://file.txt")){
         char [] a = new char[50];
         fr.read(a); // reads the contentto the array
         for(char c : a)
         System.out.print(c); //prints the characters one by one
      }catch(IOException e){
          e.printStackTrace();
       }   
   }
}

Poin berikut harus diingat saat bekerja dengan try-dengan pernyataan sumber.

Untuk menggunakan kelas dengan sumber daya mencoba-dengan-pernyataan itu harus mengimplementasikan antarmuka AutoCloseable dan dekat () metode itu akan dipanggil secara otomatis pada saat runtime.

Anda dapat mendeklarasikan lebih dari satu kelas di sumber try-dengan-pernyataan.

sementara Anda menyatakan beberapa kelas di blok try sumber daya mencoba-dengan-pernyataan kelas ini ditutup dalam urutan terbalik.

Kecuali perlambatan sumber daya dalam kurung setiap hal yang sama seperti biasa blok try / catch blok try.

Sumber daya dinyatakan dalam try akan dipakai sebelum dimulainya try-blok.

Sumber daya dideklarasikan pada blok try secara implisit dinyatakan sebagai akhir.

User-didefinisikan Pengecualian:
Anda dapat membuat pengecualian Anda sendiri di Jawa. Menjaga hal berikut dalam pikiran ketika menulis kelas pengecualian Anda sendiri:

Semua pengecualian harus menjadi anak Throwable.

Jika Anda ingin menulis pengecualian diperiksa yang secara otomatis diberlakukan oleh Handle atau Menyatakan Rule, Anda perlu memperpanjang kelas Exception.

Jika Anda ingin menulis pengecualian runtime, Anda perlu memperpanjang kelas RuntimeException.

Kita dapat mendefinisikan kelas Exception kita sendiri seperti di bawah ini:

class MyException extends Exception{
}

Anda hanya perlu memperpanjang kelas Exception yang telah ditetapkan untuk membuat Exception Anda sendiri. Ini dianggap pengecualian diperiksa. Berikut kelas InsufficientFundsException adalah pengecualian yang ditetapkan pengguna yang meluas kelas Exception, membuatnya menjadi pengecualian diperiksa. Kelas pengecualian adalah seperti kelas lain, mengandung bidang manfaat dan metode.

contoh:

// File Name InsufficientFundsException.java
import java.io.*;

public class InsufficientFundsException extends Exception
{
   private double amount;
   public InsufficientFundsException(double amount)
   {
      this.amount = amount;
   } 
   public double getAmount()
   {
      return amount;
   }
}

Untuk menunjukkan menggunakan user-defined pengecualian kami, kelas CheckingAccount berikut berisi metode menarik () yang melempar InsufficientFundsException.

// File Name CheckingAccount.java
import java.io.*;

public class CheckingAccount
{
   private double balance;
   private int number;
   
   public CheckingAccount(int number)
   {
      this.number = number;
   }
   
   public void deposit(double amount)
   {
      balance += amount;
   }
   
   public void withdraw(double amount) throws InsufficientFundsException
   {
      if(amount <= balance)
      {
         balance -= amount;
      }
      else
      {
         double needs = amount - balance;
         throw new InsufficientFundsException(needs);
      }
   }
   
   public double getBalance()
   {
      return balance;
   }
   
   public int getNumber()
   {
      return number;
   }
}

Mengikuti program BankDemo mendemonstrasikan memohon deposit () dan mundur () metode CheckingAccount.

// File Name BankDemo.java
public class BankDemo
{
   public static void main(String [] args)
   {
      CheckingAccount c = new CheckingAccount(101);
      System.out.println("Depositing $500...");
      c.deposit(500.00);
      
      try
      {
         System.out.println("\nWithdrawing $100...");
         c.withdraw(100.00);
         System.out.println("\nWithdrawing $600...");
         c.withdraw(600.00);
      }catch(InsufficientFundsException e)
      {
         System.out.println("Sorry, but you are short $" + e.getAmount());
         e.printStackTrace();
      }
    }
}

Mengkompilasi semua di atas tiga file dan menjalankan BankDemo, ini akan menghasilkan hasil sebagai berikut:

Depositing $500...

Withdrawing $100...

Withdrawing $600...
Sorry, but you are short $200.0
InsufficientFundsException
        at CheckingAccount.withdraw(CheckingAccount.java:25)
        at BankDemo.main(BankDemo.java:13)

Pengecualian umum:
Di Jawa, adalah mungkin untuk menentukan dua catergories dari Pengecualian dan Kesalahan.

JVM Pengecualian: - Ini adalah pengecualian / kesalahan yang eksklusif atau logis dilemparkan oleh JVM. Contoh: NullPointerException, ArrayIndexOutOfBoundsException, ClassCastException,

Pengecualian program: - pengecualian ini dilemparkan secara eksplisit oleh aplikasi atau programmer API Contoh: IllegalArgumentException, IllegalStateException.

14 comments:

  1. It seems you are so busy in last month. The detail you shared about your work and it is really impressive that's why i am waiting for your post because i get the new ideas over here and you really write so well.

    Java training in Chennai

    Java training in Bangalore

    ReplyDelete
  2. Thank you so much for a well written, easy to understand article on this. It can get really confusing when trying to explain it – but you did a great job. Thank you!

    Data Science training in Chennai
    Data science training in Bangalore
    Data science training in pune
    Data science online training
    Data Science Interview questions and answers
    Data Science Tutorial

    ReplyDelete
  3. I appreciate your efforts because it conveys the message of what you are trying to say. It's a great skill to make even the person who doesn't know about the subject could able to understand the subject . Your blogs are understandable and also elaborately described. I hope to read more and more interesting articles from your blog. All the best.
    Best Devops online Training
    Online DevOps Certification Course - Gangboard
    Best Devops Training institute in Chennai

    ReplyDelete
  4. The post is absolutely fantastic! Lots of great information and inspiration both of which we all need! Also like to admire the time and effort you put into your blog.
    keep it up!!

    android training in chennai

    android online training in chennai

    android training in bangalore

    android training in hyderabad

    android Training in coimbatore

    android training

    android online training

    ReplyDelete
  5. Regular visits listed here are the easiest method to appreciate your energy, which is why why I am going to the website everyday, searching for new, interesting info. Many, thank you!
    data scientist training in hyderabad

    ReplyDelete
  6. It is imperative that we read blog post very carefully. I am already done it and find that this post is really amazing.
    data scientist training and placement in hyderabad

    ReplyDelete
  7. Wonderful blog found to be very impressive and I want to express my admiration of your writing skills. I really appreciate the blogger for the efforts they have put in to develop such an amazing content

    Data Science Training in Hyderabad

    ReplyDelete
  8. This blog was really great, never seen a great blog like this before. i think im gonna share this to my friends..
    data science course in hyderabad

    ReplyDelete
  9. Certainly as a rule exceptionally fascinating post. I was searching for such a data and completely appreciated the experience of looking at this one. Continue to post. An obligation of appreciation is all together for sharing.business analytics course in ghaziabad

    ReplyDelete