Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> java

Jawa - Pengecualian

Pengecualian (atau kejadian luar biasa) adalah masalah yang muncul selama eksekusi suatu program. Saat Pengecualian terjadi aliran normal program terganggu dan program/Aplikasi berakhir secara tidak normal, yang tidak disarankan, oleh karena itu, pengecualian ini harus ditangani.

Pengecualian dapat terjadi karena berbagai alasan. Berikut adalah beberapa skenario di mana pengecualian terjadi.

Beberapa pengecualian ini disebabkan oleh kesalahan pengguna, yang lain oleh kesalahan pemrogram, dan lainnya oleh sumber daya fisik yang gagal dalam beberapa cara.

Berdasarkan ini, kami memiliki tiga kategori Pengecualian. Anda perlu memahaminya untuk mengetahui cara kerja penanganan pengecualian di Java.

Misalnya, jika Anda menggunakan FileReader class dalam program Anda untuk membaca data dari file, jika file yang ditentukan dalam konstruktornya tidak ada, maka FileNotFoundException terjadi, dan kompilator meminta programmer untuk menangani pengecualian.

Contoh

Demo Langsung
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 mengkompilasi program di atas, Anda akan mendapatkan pengecualian berikut.

Keluaran

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 Karena metode read() dan tutup() kelas FileReader melempar IOException, Anda dapat mengamati bahwa compiler memberi tahu untuk menangani IOException, bersama dengan FileNotFoundException.

Misalnya, jika Anda telah mendeklarasikan larik berukuran 5 dalam program Anda, dan mencoba memanggil th ke-6 elemen array maka ArrayIndexOutOfBoundsExceptionexception terjadi.

Contoh

Demo Langsung
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 berikut.

Keluaran

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

Hierarki Pengecualian

Semua kelas pengecualian adalah subtipe dari kelas java.lang.Exception. Kelas pengecualian adalah subkelas dari kelas Throwable. Selain kelas pengecualian ada subkelas lain yang disebut Error yang diturunkan dari kelas Throwable.

Kesalahan adalah kondisi abnormal yang terjadi jika terjadi kegagalan parah, ini tidak ditangani oleh program Java. Kesalahan dihasilkan untuk menunjukkan kesalahan yang dihasilkan oleh lingkungan runtime. Contoh:JVM kehabisan memori. Biasanya, program tidak dapat pulih dari kesalahan.

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

Berikut adalah daftar Pengecualian Bawaan Java yang paling umum dicentang dan tidak dicentang.

Metode Pengecualian

Berikut adalah daftar metode penting yang tersedia di kelas Throwable.

No.Pr. Metode &Deskripsi
1

getMessage() String publik()

Mengembalikan pesan mendetail tentang pengecualian yang telah terjadi. Pesan ini diinisialisasi dalam konstruktor Throwable.

2

getPenyebab Throwable publik()

Mengembalikan penyebab pengecualian yang diwakili oleh objek Throwable.

3

String publik toString()

Mengembalikan nama kelas yang digabungkan dengan hasil getMessage().

4

public void printStackTrace()

Mencetak hasil toString() bersama dengan pelacakan tumpukan ke System.err, aliran keluaran kesalahan.

5

publik StackTraceElement [] getStackTrace()

Mengembalikan array yang berisi setiap elemen pada pelacakan tumpukan. Elemen pada indeks 0 mewakili bagian atas tumpukan panggilan, dan elemen terakhir dalam array mewakili metode di bagian bawah tumpukan panggilan.

6

Publik Throwable fillInStackTrace()

Mengisi pelacakan tumpukan objek Throwable ini dengan pelacakan tumpukan saat ini, menambahkan informasi sebelumnya dalam pelacakan tumpukan.

Menangkap Pengecualian

Metode menangkap pengecualian menggunakan kombinasi coba dan menangkap kata kunci. Blok coba/tangkap ditempatkan di sekitar kode yang mungkin menghasilkan pengecualian. Kode dalam blok try/catch disebut sebagai kode yang dilindungi, dan sintaks untuk menggunakan try/catch terlihat seperti berikut −

Sintaks

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

Kode yang rentan terhadap pengecualian ditempatkan di blok coba. Ketika pengecualian terjadi, pengecualian yang terjadi ditangani oleh blok tangkap yang terkait dengannya. Setiap blok try harus segera diikuti oleh blok catch atau blok akhirnya.

Pernyataan tangkap melibatkan mendeklarasikan jenis pengecualian yang Anda coba tangkap. Jika pengecualian terjadi dalam kode yang dilindungi, blok tangkap (atau blok) yang mengikuti percobaan dicentang. Jika jenis eksepsi yang terjadi tercantum dalam blok catch, eksepsi akan diteruskan ke blok catch seperti halnya argumen diteruskan ke parameter metode.

Contoh

Berikut ini adalah array yang dideklarasikan dengan 2 elemen. Kemudian kode mencoba mengakses ke-3 elemen array yang melempar pengecualian.

Demo Langsung
// 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");
   }
}

Ini akan menghasilkan hasil berikut

Keluaran

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

Beberapa Blok Tangkapan

Sebuah blok try dapat diikuti oleh beberapa blok catch. Sintaks untuk beberapa blok tangkapan terlihat seperti berikut −

Sintaks

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

Pernyataan sebelumnya menunjukkan tiga blok tangkapan, tetapi Anda dapat memiliki berapa pun jumlahnya setelah satu percobaan. Jika pengecualian terjadi dalam kode yang dilindungi, pengecualian dilemparkan ke blok tangkapan pertama dalam daftar. Jika tipe data dari eksepsi yang dilempar cocok dengan ExceptionType1, itu akan ditangkap di sana. Jika tidak, pengecualian diteruskan ke pernyataan catch kedua. Ini berlanjut hingga pengecualian ditangkap atau jatuh melalui semua tangkapan, dalam hal ini metode saat ini menghentikan eksekusi dan pengecualian dilemparkan ke metode sebelumnya pada tumpukan panggilan.

Contoh

Berikut adalah segmen kode yang menunjukkan cara 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;
}

Menangkap Beberapa Jenis Pengecualian

Sejak Java 7, Anda dapat menangani lebih dari satu pengecualian menggunakan satu blok tangkap, fitur ini menyederhanakan kode. Inilah cara Anda melakukannya

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

Kata Kunci Lemparan/Lempar

Jika suatu metode tidak menangani pengecualian yang dicentang, metode tersebut harus mendeklarasikannya menggunakan throws kata kunci. Kata kunci throws muncul di akhir tanda tangan metode.

Anda dapat melempar pengecualian, baik yang baru dipakai atau pengecualian yang baru saja Anda tangkap, dengan menggunakan lemparan kata kunci.

Coba pahami perbedaan antara kata kunci lempar dan lempar, lempar digunakan untuk menunda penanganan pengecualian yang diperiksa dan melempar digunakan untuk memanggil pengecualian secara eksplisit.

Metode berikut mendeklarasikan bahwa ia melempar RemoteException

Contoh

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 mendeklarasikan bahwa ia melempar lebih dari satu pengecualian, dalam hal ini pengecualian dideklarasikan dalam daftar yang dipisahkan dengan koma. Misalnya, metode berikut mendeklarasikan bahwa ia melempar RemoteException dan InsufficientFundsException

Contoh

import java.io.*;
public class className {

   public void withdraw(double amount) throws RemoteException, 
      InsufficientFundsException {
      // Method implementation
   }
   // Remainder of class definition
}

Blok Terakhir

Blok akhirnya mengikuti blok coba atau blok tangkap. Sebuah blok kode akhirnya selalu dieksekusi, terlepas dari terjadinya Pengecualian.

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

Blok akhirnya muncul di akhir blok tangkap dan memiliki sintaks berikut

Sintaks

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

Demo Langsung
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");
      }
   }
}

Ini akan menghasilkan hasil berikut

Keluaran

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

Perhatikan berikut ini

Coba-dengan-sumber daya

Umumnya, ketika kita menggunakan sumber daya apa pun seperti aliran, koneksi, dll. Kita harus menutupnya secara eksplisit menggunakan blok akhirnya. Dalam program berikut, kita membaca data dari sebuah file menggunakan FileReader dan kami menutupnya menggunakan blok akhirnya.

Contoh

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();
         }
      }
   }
}

coba-dengan-sumber daya , juga disebut sebagai pengelolaan sumber daya otomatis , adalah mekanisme penanganan pengecualian baru yang diperkenalkan di Java 7, yang secara otomatis menutup sumber daya yang digunakan dalam blok try catch.

Untuk menggunakan pernyataan ini, Anda hanya perlu mendeklarasikan sumber daya yang diperlukan dalam tanda kurung, dan sumber daya yang dibuat akan ditutup secara otomatis di akhir blok. Berikut adalah sintaks dari pernyataan try-with-resources.

Sintaks

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

Berikut adalah program yang membaca data dalam file menggunakan pernyataan try-with-resources.

Contoh

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-poin berikut harus diingat saat bekerja dengan pernyataan try-with-resources.

Pengecualian Buatan Pengguna

Anda dapat membuat pengecualian Anda sendiri di Java. Ingatlah poin-poin berikut saat menulis kelas pengecualian Anda sendiri −

Kita dapat mendefinisikan kelas Pengecualian kita sendiri seperti di bawah ini

class MyException extends Exception {
}

Anda hanya perlu memperluas Pengecualian yang telah ditentukan sebelumnya kelas untuk membuat Pengecualian Anda sendiri. Ini dianggap sebagai pengecualian yang diperiksa. Berikut InsufficientFundsException class adalah pengecualian yang ditentukan pengguna yang memperluas kelas Pengecualian, menjadikannya pengecualian yang diperiksa. Kelas pengecualian seperti kelas lainnya, berisi bidang dan metode yang berguna.

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 mendemonstrasikan menggunakan pengecualian yang ditentukan pengguna kami, kelas CheckingAccount berikut berisi metode withdraw() 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;
   }
}

Program BankDemo berikut mendemonstrasikan pemanggilan metode deposit() dan withdraw() dari 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();
      }
   }
}

Kompilasi ketiga file di atas dan jalankan BankDemo. Ini akan menghasilkan hasil berikut

Keluaran

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 Java, dimungkinkan untuk mendefinisikan dua kategori Pengecualian dan Kesalahan.


java

  1. Operator Jawa
  2. Komentar Jawa
  3. Java untuk setiap Loop
  4. String Jawa
  5. Penanganan Pengecualian Java
  6. Lemparan Jawa
  7. Java menangkap Beberapa Pengecualian
  8. Java mencoba-dengan-sumber daya
  9. Anotasi Jawa
  10. Pernyataan Jawa