JavaRush /Blog Java /Random-MS /Coffee break #220. Cara Membetulkan Pengecualian dalam Ja...

Coffee break #220. Cara Membetulkan Pengecualian dalam Java - Panduan Terperinci

Diterbitkan dalam kumpulan
Sumber: JavaTechOnline Tutorial ini akan membantu anda mempelajari cara membetulkan pengecualian biasa dalam Java. Sebagai tambahan kepada teori, anda akan melihat contoh kod untuk menyelesaikan masalah tersebut. Coffee break #220.  Cara Membetulkan Pengecualian dalam Java - Panduan Terperinci - 1Seperti bahasa pengaturcaraan lain, pembangun Java mungkin menghadapi ralat atau pengecualian semasa menulis kod. Pengecualian harus diambil serius kerana kejadiannya mengambil masa bekerja. Walau bagaimanapun, dengan sedikit pengetahuan, anda boleh mempercepatkan penyelesaian kebanyakan masalah ini. Jadi, mari kita pelajari cara membetulkan pengecualian biasa dalam Java.

Garis Panduan Umum untuk Mengelak Pengecualian di Jawa

Untuk mengelak daripada membuang sebarang pengecualian dalam Java, adalah penting untuk memahami dan mengikuti garis panduan pengekodan:
  1. Sentiasa sahkan input pengguna sebelum menggunakannya dalam kod anda.
  2. Gunakan try-catch , throws , throw blocks , bergantung pada perkara yang sesuai untuk senario tertentu.
  3. Jangan abaikan mesej dalam kod tentang pemprosesan dan ralat. Ini akan membantu mengenal pasti dan membetulkan masalah.
  4. Pastikan anda mengelog pengecualian untuk tujuan penyahpepijatan. Anda boleh menggunakan mesej logger untuk membantu mengenal pasti masalah.
  5. Ikuti amalan terbaik pengekodan untuk mengelakkan pengecualian dan menguji kod anda dengan teliti.
  6. Kemas kini kebergantungan API anda untuk memastikan anda menggunakan versi perpustakaan dan rangka kerja yang terkini dan paling stabil.
  7. Gunakan alatan yang diperlukan dan rangka kerja ujian untuk mengenal pasti masalah yang berpotensi dalam kod anda sebelum ia menimbulkan pengecualian.
  8. Pantau prestasi dan log aplikasi anda untuk mengenal pasti dan menyelesaikan sebarang isu dengan cepat.
  9. Ikuti perkembangan terkini dengan amalan terbaik keselamatan untuk memastikan kod anda selamat dan dilindungi daripada sebarang kemungkinan serangan.
  10. Dokumentasikan kod anda dan pengecualiannya dengan teliti untuk memudahkan pembangun lain memahami dan menyelenggara.

Senarai pengecualian yang paling biasa di Jawa

Java mempunyai senarai pengecualian yang agak panjang. Mari lihat beberapa yang paling biasa:

NullPointerException

NullPointerException ialah sejenis pengecualian RuntimeException . Ia berlaku apabila kita cuba menggunakan pembolehubah rujukan yang mempunyai nilai nol. Ini bermakna ia menunjuk kepada objek atau pembolehubah yang nilainya adalah null . Ralat sedemikian boleh berlaku apabila kami cuba memanggil kaedah atau mengakses medan objek yang belum dimulakan, atau apabila kami menyerahkan null sebagai parameter kepada kaedah yang tidak mengendalikannya. Untuk mengelakkan NullPointerException daripada dilemparkan , anda boleh menyemak sama ada pembolehubah rujukan adalah null menggunakan operator == . Jika ini berlaku, maka kes nol perlu dikendalikan dengan betul. Sebagai alternatif, kami boleh memulakan pembolehubah kami kepada nilai lalai (jika boleh) untuk memastikan bahawa kami tidak pernah menemui rujukan nol. Satu lagi cara untuk mengelakkan NullPointerException adalah dengan menggunakan kelas Pilihan . Di Jawa, Pilihan ialah objek bekas yang mungkin mengandungi nilai bukan nol atau tidak. Ia digunakan untuk mewakili kehadiran atau ketiadaan nilai, sama seperti cara nilai nol digunakan untuk mewakili ketiadaan nilai. Jika pengaturcara cuba mengakses nilai kosong objek Pilihan , atur cara tidak akan membuang NullPointerException tetapi sebaliknya akan mengembalikan objek Pilihan kosong . Dalam erti kata lain, Pilihan memaksa pengaturcara mengendalikan kes di mana nilai tiada, yang membantu mengelakkan NullPointerException .

IndexOutOfBoundsException

IndexOutOfBoundsException ialah pengecualian masa jalan yang dilemparkan apabila indeks yang digunakan untuk mengakses tatasusunan atau koleksi adalah negatif atau lebih besar daripada atau sama dengan saiz tatasusunan atau koleksi. Untuk mengelakkan pengecualian ini daripada berlaku, kita mesti memastikan bahawa indeks yang digunakan untuk mengakses tatasusunan atau koleksi berada dalam hadnya, iaitu, ia mestilah lebih besar daripada atau sama dengan sifar dan kurang daripada saiz tatasusunan atau koleksi.

ArrayIndexOutOfBoundsException

ArrayIndexOutOfBoundsException ialah sejenis IndexOutOfBoundsException yang dilemparkan apabila percubaan dibuat untuk mengakses tatasusunan pada indeks yang tidak sah. Di Java, indeks tatasusunan bermula pada 0 dan berakhir pada length()-1 , dengan length() ialah bilangan elemen dalam tatasusunan. Jika anda cuba mengakses elemen pada indeks di luar julat ini, Java akan membuang ArrayIndexOutOfBoundsException . Apabila menemui ArrayIndexOutOfBoundsException , anda harus menyemak kod anda untuk memastikan bahawa anda menggunakan indeks yang betul semasa mengakses elemen dalam tatasusunan.

StringIndexOutOfBoundsException

StringIndexOutOfBoundsException ialah jenis IndexOutOfBoundsException yang dilemparkan apabila percubaan dibuat untuk mengakses aksara dalam rentetan yang mempunyai indeks yang tidak sah. Seperti ArrayIndexOutOfBoundsException sebelumnya , ingat bahawa dalam Java, indeks rentetan bermula pada 0 dan berakhir pada length()-1 , dengan length() ialah bilangan aksara dalam rentetan. Jika anda cuba mengakses aksara pada indeks di luar julat ini, anda mungkin menghadapi StringIndexOutOfBoundsException . Jika anda menemui StringIndexOutOfBoundsException , anda harus menyemak kod anda untuk memastikan anda menggunakan indeks yang betul semasa mengakses aksara dalam rentetan.

ClassCastException

Pengecualian ini berlaku apabila kami cuba menghantar objek kepada jenis yang tidak serasi dengan jenis sebenar. Untuk menyelesaikan masalah seperti ini, adalah penting untuk memastikan program Java anda hanya cuba menghantar objek ke kelas yang mana ia adalah kejadian. Anda boleh menyemak jenis objek menggunakan operator instanceof sebelum menggunakan cast.

IllegalArgumentException

IllegalArgumentException ialah sejenis RuntimeException yang dilemparkan apabila kaedah dipanggil dengan hujah yang tidak sah atau tidak sesuai. Dalam erti kata lain, ralat ini boleh berlaku apabila kaedah dipanggil dengan hujah yang berada di luar julat yang dijangkakan atau tidak mempunyai format atau struktur yang diharapkan. Sebagai contoh, kaedah memerlukan nombor positif sebagai hujah dan kami menyediakan nombor negatif, yang merupakan input tidak sah. Jika anda menemui IllegalArgumentException , anda harus menyemak kod anda untuk memastikan bahawa anda memanggil kaedah dengan hujah yang sah dan sesuai.

IllegalStateException

IllegalStateException ialah sejenis RuntimeException yang dilemparkan apabila objek berada dalam keadaan tidak sesuai untuk operasi yang dijalankan. Ini boleh berlaku jika kaedah dipanggil pada objek yang tidak berada dalam keadaan yang dijangkakan. Sebagai contoh, jika kita mencipta objek sambungan pangkalan data dan kemudian menutupnya. Kemudian jika kita cuba mencipta objek Pernyataan dalam sambungan tertutup, ia akan membuang IllegalStateException kerana kaedah createStatement() memerlukan sambungan terbuka. Jika anda menemui IllegalStateException , anda harus menyemak kod anda untuk memastikan bahawa anda memanggil kaedah pada objek yang berada dalam keadaan yang sesuai.

UnsupportedOperationException

UnsupportedOperationException ialah jenis RuntimeException yang dilemparkan apabila percubaan dibuat untuk melakukan operasi yang tidak disokong pada objek. Ralat ini boleh berlaku apabila kita memanggil kaedah yang tidak dilaksanakan oleh objek atau tidak disokong oleh objek. Untuk mengelakkan pengecualian daripada dilemparkan, kita tidak seharusnya memanggil operasi sedemikian yang tidak disokong pada objek. Kami perlu menyemak kod kami untuk memastikan bahawa kami memanggil kaedah pada objek yang menyokong operasi.

ArithmeticException

ArithmeticException ialah sejenis RuntimeException yang dilemparkan apabila operasi aritmetik menghasilkan hasil yang tidak sah. Pengecualian ini boleh berlaku apabila kami cuba melakukan operasi aritmetik dengan hujah yang tidak sah atau tidak sah. Sebagai contoh, apabila cuba membahagi dengan sifar. Untuk menyelesaikan masalah ini, kami boleh melakukan pengesahan input dan memastikan bahawa hujah memenuhi syarat yang diperlukan sebelum melakukan operasi aritmetik.

SecurityException

SecurityException ialah sejenis RuntimeException yang dilemparkan apabila pelanggaran keselamatan berlaku semasa pelaksanaan program. Ralat ini boleh berlaku apabila program cuba melakukan operasi yang tidak dibenarkan oleh dasar keselamatan. Untuk menyelesaikan masalah, kami mesti memastikan bahawa kami mempunyai akses kepada sumber dan melaksanakan operasi yang kami mempunyai kebenaran khusus.

NumberFormatException

NumberFormatException ialah sejenis RuntimeException yang dilemparkan apabila kaedah dipanggil untuk menukar rentetan kepada format nombor, tetapi rentetan itu tidak dalam format yang sesuai. Untuk menyelesaikan masalah ini, kami mesti terlebih dahulu mengesahkan input pengguna sebelum cuba menukarnya. Semak juga kod anda untuk memastikan anda cuba menukar rentetan yang diformatkan dengan betul untuk jenis angka sasaran.

InterruptedException

InterruptedException ialah pengecualian bertanda yang dilemparkan jika utas sedang menunggu, tidur atau menyekat untuk beberapa acara dan acara itu diganggu oleh utas lain. Ralat boleh berlaku apabila utas sedang menunggu input, melepaskan kunci atau menyelesaikan beberapa operasi lain, dan utas lain mengganggu utas menunggu. Untuk menyelesaikan isu ini, anda boleh menangkap InterruptedException dan bertindak balas dengan membersihkan sumber, menghentikan urutan atau mengambil tindakan lain yang sesuai. Jika anda menghadapi InterruptedException , anda harus menyemak kod anda untuk memastikan anda mengendalikan gangguan benang dengan betul.

FileNotFoundException

FileNotFoundException ialah pengecualian bertanda yang dilemparkan apabila program cuba mengakses fail yang tidak wujud atau tidak ditemui di lokasi yang ditentukan. Ia boleh muncul jika fail tersalah eja, dialihkan atau dipadamkan, atau walaupun program tidak mempunyai kebenaran yang diperlukan untuk mengakses fail tersebut. Untuk membetulkan ralat, anda boleh melakukan pengesahan input untuk memastikan bahawa laluan fail adalah betul dan program mempunyai kebenaran yang diperlukan untuk mengakses fail.

IOException

IOException ialah pengecualian yang disemak dalam Java yang mewakili ralat yang dihadapi semasa menjalankan operasi input atau output, seperti membaca atau menulis pada fail atau soket rangkaian. Ia boleh berlaku atas beberapa sebab, seperti fail yang ditentukan hilang atau tidak boleh diakses, ralat rangkaian atau kebenaran tidak mencukupi. Untuk menyelesaikan masalah, anda perlu melakukan beberapa tindakan seperti menyemak mesej ralat, mengendalikan pengecualian menggunakan cuba-tangkap , menutup sumber, menyemak kebenaran fail dan sebagainya.

NoSuchMethodException

NoSuchMethodException ialah pengecualian yang dilemparkan semasa runtime apabila kita cuba memanggil kaedah yang tidak wujud dalam kelas. Pengecualian ini biasanya berlaku jika kita memanggil kaedah menggunakan Class.getMethod() atau Class.getDeclaredMethod() dan nama kaedah yang ditentukan tidak ditemui dalam kelas atau antara muka. Pengecualian juga boleh berlaku apabila kita cuba memanggil kaedah menggunakan kelas java.lang.reflect.Method dan nama kaedah yang ditentukan tidak wujud dalam objek. Untuk mengelakkan pengecualian ini, pastikan anda memanggil kaedah yang sah dengan tandatangan kaedah dan penentu akses yang betul.

NoSuchFieldException

NoSuchFieldException ialah pengecualian runtime yang berlaku apabila kami cuba mengakses medan yang tiada dalam kelas. Pengecualian ini biasanya berlaku apabila kita memanggil kaedah menggunakan Class.getField() atau Class.getDeclaredField() dan nama medan yang ditentukan tidak ditemui dalam kelas atau antara muka. Selain itu, ia juga boleh dipanggil jika kita cuba mengakses medan menggunakan kelas java.lang.reflect.Field dan nama medan yang ditentukan tidak wujud dalam objek. Untuk mengelakkan pengecualian ini, pastikan anda mengakses medan yang sah dengan nama yang betul dan pengubah suai akses. Jika anda mengakses medan peribadi, pastikan anda menggunakan kaedah getDeclaredField() dan bukannya kaedah getField() .

IllegalAccessException

IllegalAccessException ialah pengecualian masa jalan yang berlaku apabila kami cuba mengakses medan atau kaedah dalam kelas tetapi kami tidak mempunyai hak akses yang diperlukan. Pengecualian ini biasanya muncul apabila kami cuba mengakses medan atau kaedah persendirian dari luar kelas atau apabila kami cuba mengakses medan atau kaedah yang dilindungi daripada kelas yang bukan subkelas kelas asal. Ia juga boleh dipanggil apabila cuba mengakses medan atau kaedah yang telah ditandakan sebagai tidak tersedia oleh kelas java.lang.reflect.AccessibleObject . Untuk mengelakkan isu ini, pastikan anda mempunyai kebenaran yang diperlukan pada medan atau kaedah yang anda cuba akses. Jika medan atau kaedah adalah peribadi, anda mungkin perlu menggunakan refleksi dan menetapkan AccessibleObject kepada benar (untuk mengaksesnya). Walau bagaimanapun, berhati-hati apabila menggunakan refleksi untuk mengakses medan atau kaedah persendirian, kerana ia boleh memecahkan enkapsulasi dan menjejaskan integriti kelas.

VerifyError

VerifyError ialah ralat masa jalan yang merupakan subkelas LinkageError . Ia berlaku apabila Mesin Maya Java (JVM) menemui fail kelas yang melanggar peraturan pengesahan tertentu. Apabila kelas Java disusun, pengkompil menyemak sama ada kod bait mengikut peraturan dan sekatan tertentu, seperti keselamatan jenis dan penggunaan yang betul bagi timbunan dan pembolehubah setempat. Jika fail kelas melanggar peraturan ini, JVM akan membuang VerifyError apabila memuatkan dan menyemak kelas semasa runtime. Untuk mengelakkan VerifyError , pastikan kod anda mengikut sintaks dan semantik bahasa Java yang betul. Jika anda menghadapi VerifyError , anda harus menyemak kod anda untuk memastikan ia sah dan tiada pelanggaran peraturan pengesahan kod bait Java.

OutOfMemoryError

OutOfMemoryError ialah subkelas Error , jenis Throwable yang memperkenalkan masalah teruk yang tidak boleh diselesaikan semasa runtime. Walaupun Java 8 termasuk beberapa penambahbaikan dalam pengumpulan sampah dan pengurusan memori, anda mungkin masih menghadapi OutOfMemoryError jika aplikasi anda menggunakan terlalu banyak memori atau menguruskan penggunaan memori dengan salah. Untuk mengelakkan OutOfMemoryError , anda perlu mengurus penggunaan memori dengan betul dalam aplikasi Java anda. Ini melibatkan penggunaan struktur data dan algoritma yang menggunakan memori dengan cekap, mengelakkan penciptaan objek yang tidak perlu dan memadamkan objek dengan betul apabila ia tidak lagi diperlukan. Selain itu, anda boleh meningkatkan saiz timbunan maksimum untuk JVM dengan menggunakan bendera -Xmx semasa menjalankan program Java anda.

StackOverflowError

StackOverflowError ialah sejenis ralat yang berlaku apabila saiz tindanan yang diperlukan oleh atur cara melebihi jumlah memori yang diperuntukkan kepadanya. Ia boleh berlaku apabila program memanggil terlalu banyak kaedah bersarang atau apabila kaedah memanggil dirinya secara rekursif terlalu banyak kali, mengakibatkan gelung tak terhingga. Mesin Maya Java (JVM) memperuntukkan jumlah memori tetap untuk timbunan pelaksanaan, yang digunakan untuk menjejaki panggilan kaedah dan pembolehubah setempat. Apabila timbunan melimpah, JVM membuang StackOverflowError . Untuk mengelakkan StackOverflowError , adalah penting untuk memastikan program Java anda menggunakan rekursi dan panggilan kaedah yang mencukupi. Jika anda menghadapi StackOverflowError , anda boleh cuba meningkatkan saiz tindanan dengan menggunakan bendera -Xss semasa menjalankan program Java anda.

InvocationTargetException

InvocationTargetException ialah pengecualian yang diperiksa yang dilemparkan oleh mekanisme refleksi Java. Ia adalah sebahagian daripada pakej java.lang.reflect.InvocationTargetException dan digunakan untuk menunjukkan bahawa pengecualian berlaku semasa kaedah atau invokasi pembina. Apabila kaedah atau pembina digunakan menggunakan mekanisme refleksi Java, kaedah invoke() bagi kelas java.lang.reflect.Method atau java.lang.reflect.Constructor dipanggil . Jika kaedah atau pembina yang dipanggil melemparkan pengecualian, kaedah invoke() menangkapnya dan membungkusnya dalam InvocationTargetException . Pengecualian ini kemudiannya diserahkan kepada pemanggil kaedah invoke() . Untuk membetulkan InvocationTargetException , kita perlu menangkapnya, dapatkan pengecualian punca punca menggunakan kaedah getCause() dan kendalikan pengecualian punca punca dengan sewajarnya. Ambil perhatian bahawa punca utama boleh menjadi pengecualian yang diperiksa atau pengecualian masa jalan, jadi pastikan anda mengendalikannya dengan betul.

Cara untuk membetulkan pengecualian yang paling biasa di Jawa

Bagaimana untuk membetulkan NullPointerException

Senario: Anda mempunyai kaedah yang mengakses objek yang mempunyai nilai null .
String title= null;
System.out.println(title.length()); // Это вызовет NullPointerException
Penyelesaian #1: Periksa sama ada objek tersebut adalah batal sebelum digunakan.
if(title!= null) {
   System.out.println(title.length());
} else {
   System.out.println("title is null");
}
Penyelesaian #2: Gunakan Pilihan untuk mengelakkan NullPointerException .
Optional<String> optionalTitle = Optional.ofNullable(getTitle());
if (optionalTitle.isPresent()) {
   String title= optionalTitle.get();
   System.out.println("Title: " + title);
} else {
   System.out.println("Title is not available.");
}

Bagaimana untuk membetulkan ArrayIndexOutOfBoundsException

Senario: Anda cuba mengakses tatasusunan pada indeks yang berada di luar hadnya.
int[] numbers = {4, 5, 6};
System.out.println(numbers[3]);   // Это вызовет ArrayIndexOutOfBoundsException
Penyelesaian: Semak panjang tatasusunan sebelum mengaksesnya dan pastikan anda menggunakan indeks yang sah.
int[] numbers = {4, 5, 6};
if (numbers.length > 3) {
   System.out.println(numbers[3]);
} else {
   System.out.println("ArrayIndexOutOfBoundsException: Please use valid indexes of the Array");
}

Bagaimana untuk membetulkan ClassCastException

Senario: Anda cuba menghantar objek kepada jenis yang tidak serasi dengan jenis sebenar.
Object obj = "Java Exception";
Integer number = (Integer) obj; // Это вызовет ClassCastException
Penyelesaian: Pastikan anda hanya menghantar objek kepada jenis yang serasi dengannya.
Object obj = "Java Exception";
if(obj instanceof Integer) {
   Integer number = (Integer) obj;
   System.out.println(number);
} else {
   System.out.println("Object cannot caste to Integer");
}

Bagaimana untuk membetulkan IllegalArgumentException

Senario: Anda menyerahkan hujah yang tidak sah kepada kaedah.
public void printNumber(int number) {
   if(number <= 0) {
      throw new IllegalArgumentException("You cannot pass a negative number or zero");
   }
   System.out.println(number);
}

printNumber(-1); // Это вызовет IllegalArgumentException
Penyelesaian: Pastikan anda menyampaikan hujah yang sah kepada kaedah. Dalam kes ini, lulus nombor positif.
printNumber(1); //  Это успешно напечатает 1.

Bagaimana untuk membetulkan IllegalStateException

Senario: Objek berada dalam keadaan tidak sah.
public class Bike {

   private Boolean isStarted;

   public void start() {
      if(isStarted) {
        throw new IllegalStateException("Bike is already started");
      }
      isStarted = true;
      System.out.println("Bike started");
   }
}

Bike bike= new Bike();
bike.start();
bike.start(); // Это вызовет IllegalStateException потому что bike is already started
Penyelesaian: Pastikan anda mengekalkan keadaan objek dengan betul.
Bike bike= new Bike();
bike.start();

Bagaimana untuk membetulkan UnsupportedOperationException

Senario: Anda menggunakan operasi yang tidak disokong oleh objek. Satu contoh popular ialah apabila anda menggunakan operasi remove() pada koleksi tidak berubah, anda mungkin akan melihat pengecualian UnsupportedOperationException .
List<String> list = Arrays.asList("Java", "Angular", "Spring");
list.add("Python"); // Это вызовет UnsupportedOperationException
Oleh kerana kaedah Arrays.asList() mengembalikan senarai yang tidak boleh diubah, kaedah ini tidak menyokong menambah atau mengalih keluar elemen. Penyelesaian: Pastikan anda hanya memanggil operasi yang disokong pada objek.
List<String> list = new ArrayList<>(Arrays.asList("Java", "Angular" "Spring"));
list.add("Python");
System.out.println(list);

Bagaimana untuk membetulkan ArithmeticException

Senario #1: Anda cuba melakukan operasi bahagi integer yang menghasilkan hasil pecahan.
int i = 10;
int j = 4;
int k = i/j; // Это вызовет исключение ArithmeticException: целочисленное деление будет дробным
Di sini hasil operasi bahagi ialah 2.5, iaitu nilai pecahan. Oleh kerana integer tidak boleh menyimpan nilai pecahan, ArithmeticException dilemparkan . Penyelesaian: Untuk mengelakkan pengecualian ini, kita boleh menggunakan jenis data yang menyokong nilai pecahan, seperti double , untuk menyimpan hasil operasi bahagi. Berikut ialah contoh:
int i = 10;
int j = 4;
double k = (double) i/j;
Senario #2: Anda cuba bahagikan dengan sifar dan anda mendapat pengecualian ini. Ini adalah senario yang paling biasa.
int i = 4;
int j = 0;
int k = i/j; // Это вызовет исключение ArithmeticException: нельзя делить на ноль
Penyelesaian: Kendalikan pembahagian dengan sifar dengan betul. Sebagai contoh, kod di bawah menunjukkan pemprosesan yang betul.
int i = 4;
int j = 0;
if(j != 0) {
int k = i/j;
System.out.println(k);
} else {
System.out.println("ArithmeticException: Cannot divide by zero");
}

Bagaimana untuk membetulkan IndexOutOfBoundsException

Senario: Anda cuba mengakses koleksi dengan indeks yang berada di luarnya.
List<String> list = Arrays.asList("Apple", "Papaya", "Mango");
System.out.println(list.get(3)); // Это вызовет IndexOutOfBoundsException
Penyelesaian: Semak saiz koleksi sebelum mengaksesnya dan pastikan anda menggunakan indeks yang sah.
List<String> list = Arrays.asList("Apple", "Papaya", "Mango");
if (list.size() > 3) {
   System.out.println(list.get(3));
} else {
   System.out.println("You are using the Index which is out of bounds");
}

Bagaimana untuk membetulkan IOException

Senario: Operasi input/output gagal kerana fail tidak boleh diakses.
try {
   File inputFile = new FileReader("pqr.txt");
   BufferedReader reader = new BufferedReader(inputFile);
   String line = reader.readLine();
   System.out.println(line);
} catch (IOException e) {
   e.printStackTrace();
}
Penyelesaian: Kendalikan ralat I/O dan pastikan sumber ditutup dengan betul.
File inputFile = new File("pqr.txt");

if (!inputFile.exists() || !inputFile.canRead()) {
 System.out.println("The input file is missing or not readable.");
 return;
}

try {
BufferedReader reader = new BufferedReader(inputFile);
 String line = reader.readLine();
 System.out.println(line);
  reader.close();
} catch (IOException e) {
 e.printStackTrace();
}
Ambil perhatian bahawa sebagai alternatif, kita boleh menggunakan ciri cuba-dengan-sumber yang diperkenalkan dalam Java 7 untuk menutup sumber secara automatik seperti yang ditunjukkan di bawah. Kami boleh mengisytiharkan satu atau lebih sumber dalam pernyataan cuba , dan Java akan menutup sumber secara automatik pada penghujung blok, tidak kira sama ada blok selesai secara normal atau pengecualian dilemparkan.
try (BufferedReader reader = new BufferedReader(new FileReader("pqr.txt"))) {
....
} catch {
....
}

Bagaimana untuk membetulkan FileNotFoundException

Senario: Fail tidak ditemui di lokasi yang ditentukan.
try {
     BufferedReader reader = new BufferedReader(new FileReader("abc.txt"));
     String line = reader.readLine();
     System.out.println(line);
     reader.close();
} catch (FileNotFoundException | IOException e) {
     System.out.println("An error has occurred while reading the file: " + e.getMessage());
}
Penyelesaian: Pastikan fail itu wujud dan anda mempunyai kebenaran yang sesuai untuk mengaksesnya.
try {
    File file = new File("abc.txt");
    if(!file.exists()) {
    throw new FileNotFoundException("File not found at the specified location");
    }
    BufferedReader reader = new BufferedReader(new FileReader(file));
    String line = reader.readLine();
    System.out.println(line);
    reader.close();
} catch (IOException e) {
    e.printStackTrace();
}

Bagaimana untuk membetulkan NoSuchMethodException

Senario: Jika anda cuba mengakses kaedah yang tidak ditemui.
public class TestClass {
   public void sayHello() {
      System.out.println("Hello");
   }
}

TestClass obj = new TestClass();
Method method = obj.getClass().getMethod("printHello"); // Это вызовет NoSuchMethodException
Penyelesaian: Sahkan bahawa kaedah itu wujud dan nama kaedah serta tandatangan adalah betul.
public class TestClass {
   public void sayHello() {
      System.out.println("Hello");
   }
}

TestClass  obj = new TestClass();
try {
    Method method = obj.getClass().getMethod("sayHello");
} catch (NoSuchMethodException e) {
    e.printStackTrace();
}

Bagaimana untuk membetulkan ConcurrentModificationException

Senario: Koleksi berubah semasa ia diulang.
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
for (String str : list) {
  list.remove(str);  // Это вызовет ConcurrentModificationException
}
Penyelesaian: Gunakan iterator untuk mengulang koleksi dan mengubah suai menggunakan kaedah iterator.
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String str = iterator.next();
    iterator.remove();
}
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION