Latest web development tutorials
×

Java หลักสูตร

Java หลักสูตร Java แนะนำโดยย่อ Java การกำหนดค่าการพัฒนาสภาพแวดล้อม Java พื้นฐานไวยากรณ์ Java วัตถุและการเรียน Java ชนิดข้อมูลพื้นฐาน Java ประเภทตัวแปร Java การปรับเปลี่ยน Java ผู้ประกอบการ Java โครงสร้างห่วง Java สาขาโครงสร้าง Java Number หมวดหมู่ Java Character หมวดหมู่ Java String หมวดหมู่ Java StringBuffer Java แถว Java วันที่เวลา Java นิพจน์ปกติ Java ทาง Java Stream,File,IO Java Scanner หมวดหมู่ Java การจัดการข้อยกเว้น

Java เชิงวัตถุ

Java สืบทอด Java Override/Overload Java polymorphism Java ระดับนามธรรม Java บรรจุภัณฑ์ Java อินเตอร์เฟซ Java บรรจุภัณฑ์

Java การสอนที่ทันสมัย

Java โครงสร้างข้อมูล Java คอลเลกชันกรอบ Java ยาชื่อสามัญ Java การทำให้เป็นอันดับ Java เขียนโปรแกรมเครือข่าย Java ส่ง Email Java การเขียนโปรแกรมแบบมัลติเธรด Java Appletรากฐาน Java เอกสารความคิดเห็น Java ตัวอย่าง Java 8 คุณสมบัติใหม่ Java MySQL สัมพันธ์

การจัดการข้อยกเว้น Java

ข้อยกเว้นข้อผิดพลาดบางในโปรแกรม แต่ไม่ได้ข้อผิดพลาดทั้งหมดเป็นข้อยกเว้นและบางครั้งความผิดพลาดสามารถหลีกเลี่ยงได้

ตัวอย่างเช่นรหัสของคุณน้อยอัฒภาคแล้ววิ่งออกไปจากผลการคือการแจ้งให้ java.lang.Error ผิดถ้าคุณใช้ System.out.println (11/0) แล้วคุณจะทำเพราะคุณใช้ตัวหาร 0 มันจะถูกโยนยกเว้น java.lang.ArithmeticException

มีหลายเหตุผลสำหรับข้อยกเว้นเกิดขึ้นมักจะมีประเภทต่อไปนี้:

  • ผู้ใช้ป้อนข้อมูลที่ผิดกฎหมาย
  • เพื่อเปิดไฟล์ไม่ได้อยู่
  • การเชื่อมต่อเครือข่ายการสื่อสารถูกขัดจังหวะหรือหน่วยความจำ JVM ล้น

ข้อยกเว้นเหล่านี้อย่างใดอย่างหนึ่งเพราะความผิดพลาดของผู้ที่เกิดข้อผิดพลาดในการดำเนินการเกิดเพราะมีข้อผิดพลาดทางกายภาพอื่น ๆ -

เพื่อให้เข้าใจถึงการจัดการข้อยกเว้น Java เป็นวิธีการทำงานคุณจะต้องมีดังต่อไปนี้สามประเภทของข้อยกเว้น:

  • การตรวจสอบข้อยกเว้น: ตัวแทนมากที่สุดการตรวจสอบข้อยกเว้นเป็นข้อยกเว้นเนื่องจากข้อผิดพลาดของผู้ใช้หรือปัญหาที่เกิดขึ้นก็เป็นโปรแกรมเมอร์ที่คาดเดา ตัวอย่างเช่นเมื่อคุณต้องการที่จะเปิดไฟล์ไม่ได้อยู่ที่เกิดข้อยกเว้นข้อยกเว้นที่ไม่สามารถละเลยเพียงที่รวบรวมเวลา
  • ยกเว้นมีแนวโน้มที่จะเป็นโปรแกรมเมอร์ที่จะหลีกเลี่ยงการทำงานผิดปกติ: เวลาทำงานยกเว้น ในทางตรงกันข้ามกับข้อยกเว้นการตรวจสอบข้อยกเว้นรันไทม์สามารถปฏิเสธที่รวบรวมเวลา
  • ข้อผิดพลาด: ข้อผิดพลาดที่ไม่ได้ผิดปกติ แต่จากคำถามของการควบคุมของโปรแกรมเมอร์ ข้อผิดพลาดในรหัสที่มักจะถูกละเลย ตัวอย่างเช่นเมื่อกองล้นข้อผิดพลาดเกิดขึ้นพวกเขาไม่สามารถตรวจสอบที่รวบรวมเวลา

ลำดับชั้นยกเว้น

ทุกชั้นเรียนยกเว้นสืบทอดจาก java.lang.Exception subclass

ระดับข้อยกเว้นเป็น subclass ของชั้น Throwable นอกเหนือไปจากชั้นยกเว้น Throwable มี subclass ของข้อผิดพลาด

โปรแกรมจาวามักจะไม่ได้จับข้อผิดพลาด ข้อผิดพลาดมักเกิดขึ้นเมื่อมีความผิดร้ายแรงที่พวกเขาจะมองเห็นด้านนอกการประมวลผลโปรแกรม Java

สภาพแวดล้อมรันไทม์ข้อผิดพลาดมาใช้เพื่อระบุข้อผิดพลาดเกิดขึ้น

ยกตัวอย่างเช่นหน่วยความจำ JVM ล้น โดยทั่วไปโปรแกรมไม่ได้กู้คืนจากข้อผิดพลาด

ระดับยกเว้นมีสองหลักหมวดย่อย: ระดับ IOException และชั้น RuntimeException

Built-in ชั้น Java (ต่อไปจะอธิบาย) ก็มีมากที่สุดของการตรวจสอบตามปกติและไม่ได้ตรวจสอบข้อยกเว้น


Built-in ชั้นยกเว้น Java

ภาษา Java กำหนดข้อยกเว้นหลายชั้นเรียนในแพคเกจ java.lang มาตรฐาน

มาตรฐานการเรียนการยกเว้น runtime เป็น subclasses ของชั้นเรียนยกเว้นที่พบมากที่สุด เนื่องจากแพ็กเกจ java.lang ถูกโหลดโดยค่าเริ่มต้นให้กับทุกโปรแกรมจาวาดังนั้นส่วนใหญ่มาจากการเรียนการยกเว้นความผิดปกติ Runtime สืบทอดมาสามารถนำมาใช้โดยตรง

ตามที่ห้องสมุดชั้น Java ต่าง ๆ นอกจากนี้ยังกำหนดจำนวนของข้อยกเว้นอื่น ๆ ตารางต่อไปนี้แสดง Java ยกเว้นไม่ถูกตรวจสอบ

ผิดปกติ ลักษณะ
ArithmeticException เมื่อมีเงื่อนไขการทำงานผิดปกติ, ข้อยกเว้นนี้จะถูกโยนทิ้ง ยกตัวอย่างเช่นจำนวนเต็ม "หารด้วยศูนย์" โยนสแตนซ์ของคลาสนี้
ArrayIndexOutOfBoundsException ด้วยดัชนีที่ผิดกฎหมายในการเข้าถึงอาร์เรย์โยน หากดัชนีมีค่าเป็นลบหรือมากกว่าหรือเท่ากับขนาดของอาร์เรย์ดัชนีเป็นดัชนีที่ผิดกฎหมาย
ArrayStoreException พยายามที่จะเก็บผิดประเภทของวัตถุลงในอาร์เรย์ยกเว้นโยน
ClassCastException เมื่อคุณพยายามที่จะโยนวัตถุไม่ได้เป็นตัวอย่างของประเภทรองโยน
IllegalArgumentException โยนเพื่อแสดงให้เห็นว่าวิธีการที่ได้รับการผ่านการโต้แย้งที่ผิดกฎหมายหรือไม่เหมาะสม
IllegalMonitorStateException โยนเพื่อบ่งชี้ว่าด้ายมีความพยายามที่จะรอบนจอภาพของวัตถุหรือที่จะแจ้งให้วัตถุอื่น ๆ ที่กำลังรอการตรวจสอบโดยไม่ต้องด้ายจอภาพที่ระบุไว้
IllegalStateException ในกรณีของเวลาที่ผิดกฎหมายหรือไม่เหมาะสมที่จะเรียกวิธีการที่จะสร้างสัญญาณ ในคำอื่น ๆ สภาพแวดล้อม Java หรือโปรแกรม Java ไม่ได้อยู่ในสภาวะที่เหมาะสมสำหรับการดำเนินการที่ร้องขอ
IllegalThreadStateException กระทู้ไม่ได้อยู่ในสถานะที่เหมาะสมเมื่อดำเนินการที่ร้องขอต้องโยน
IndexOutOfBoundsException มันแสดงให้เห็นดัชนีการจัดเรียง (เช่นการเรียงลำดับอาร์เรย์สตริงหรือเวกเตอร์) โยนออกมาจากช่วง
NegativeArraySizeException ถ้าโปรแกรมประยุกต์พยายามที่จะสร้างอาร์เรย์ที่มีขนาดเชิงลบโยน
NullPointerException เมื่อโปรแกรมประยุกต์พยายามที่จะใช้วัตถุในความต้องการของท้องถิ่น null โยน
NumberFormatException เมื่อโปรแกรมประยุกต์พยายามที่จะแปลงสตริงเป็นชนิดที่เป็นตัวเลข แต่ที่สตริงไม่สามารถแปลงเป็นรูปแบบที่เหมาะสม dished ออกผิดปกติ
SecurityException โดยผู้จัดการการรักษาความปลอดภัยพ่นยกเว้นก็แสดงการละเมิดการรักษาความปลอดภัย
StringIndexOutOfBoundsException ยกเว้นจากนี้ String พ่นวิธีการที่จะระบุว่าดัชนีเป็นลบหรือมากกว่าขนาดของสตริง
UnsupportedOperationException เมื่อดำเนินการที่ร้องขอไม่สนับสนุนการโยน

ตารางต่อไปนี้แสดง Java ที่กำหนดไว้ในแพคเกจ java.lang ตรวจสอบการเรียนการยกเว้น

ผิดปกติ ลักษณะ
ClassNotFoundException แอพลิเคชันพยายามโหลดระดับที่คุณไม่สามารถหาระดับที่สอดคล้องกันโยน
CloneNotSupportedException เมื่อคุณเรียก Object ชั้น clone วิธีการโคลนวัตถุ แต่ระดับของวัตถุไม่สามารถดำเนินการ Cloneable อินเตอร์เฟซโยน
IllegalAccessException เมื่อปฏิเสธการเข้าถึงระดับโยน
InstantiationException เมื่อคุณพยายามที่จะใช้ Class ชั้น newInstance สร้างตัวอย่างของวิธีการเรียนการกำหนดวัตถุชั้นเพราะมันเป็นอินเตอร์เฟซหรือระดับนามธรรมไม่สามารถ instantiated, dished ออกผิดปกติ
InterruptedException ด้ายถูกขัดจังหวะด้วยด้ายอีกข้อยกเว้นนี้จะถูกโยนทิ้ง
NoSuchFieldException ตัวแปรที่ร้องขอไม่ได้อยู่
NoSuchMethodException วิธีการขอไม่อยู่

ความผิดปกติ

รายการต่อไปนี้เป็นวิธีการหลักระดับ Throwable:

เลขที่ วิธีการและรายละเอียด
1 String สาธารณะ getMessage ()
ส่งกลับข้อมูลรายละเอียดเกี่ยวกับข้อยกเว้นที่เกิดขึ้น ข่าวเริ่มต้นได้ในระดับสร้างของ Throwable
2 ประชาชน Throwable getCause ()
ส่งกลับวัตถุ Throwable ที่แสดงถึงเหตุผลในการยกเว้น
3 สาธารณะ String toString ()
ผลการค้นหาโดยใช้ getMessage () ผลตอบแทนชื่อของชั้นเรียนของน้ำตก
4 โมฆะสาธารณะ printStackTrace ()
toString พิมพ์ () ผลและสแต็คระดับ System.err คือกระแสออกข้อผิดพลาด
5 ประชาชน StackTraceElement [] getStackTrace ()
ก็จะส่งกลับอาร์เรย์ที่มีระดับกอง 0 องค์ประกอบห้อยแสดงให้เห็นถึงด้านบนของสแต็ค, องค์ประกอบสุดท้ายหมายถึงด้านล่างสแต็คโทรวิธีของสแต็ค
6 ประชาชน Throwable fillInStackTrace ()
สแต็ควัตถุ Throwable เต็มไปด้วยในระดับปัจจุบันของระดับโทรสแต็คเพิ่มระดับสแต็คของข้อมูลใด ๆ ก่อนหน้า

จับข้อยกเว้น

ใช้และพยายามจับคำหลักที่สามารถจับข้อยกเว้น ลอง / จับกระชากข้อยกเว้นสถานที่ที่อาจเกิดขึ้น

ไวยากรณ์รหัสลอง / จับบล็อกเรียกว่ารหัสป้องกันโดยใช้ลอง / จับเป็นดังนี้:

try
{
   // 程序代码
}catch(ExceptionName e1)
{
   //Catch 块
}

ตรวจจับคำสั่งมีข้อยกเว้นที่จะจับประเภทของคำสั่ง เมื่อการป้องกันรหัสป้องกันเมื่อมีข้อยกเว้นเกิดขึ้นพยายามที่ด้านหลังของการป้องกันการจับจะถูกตรวจสอบ

หากข้อยกเว้นที่มีอยู่ในการป้องกันการจับข้อยกเว้นจะถูกส่งผ่านไปยังบล็อกจับและผ่านพารามิเตอร์วิธีนี้เหมือนกัน

ตัวอย่าง

ตัวอย่างต่อไปนี้ได้ประกาศอาร์เรย์สององค์ประกอบเมื่อรหัสพยายามเข้าถึงองค์ประกอบที่สามของอาร์เรย์เมื่อมันจะโยนข้อยกเว้น

// 文件名 : 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");
   }
}

คอมไพล์โค้ดข้างต้นและเรียกใช้การส่งออกต่อไปนี้:

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

จับหลายบล็อก

ใหญ่ของบล็อกจับรหัสหลังจากการป้องกันรหัสที่เรียกว่าลองที่จะปฏิบัติตามจับหลาย

ไวยากรณ์จับบล็อกหลายเป็นดังนี้:

 try{
    // 程序代码
 }catch(异常类型1 异常的变量名1){
    // 程序代码
 }catch(异常类型2 异常的变量名2){
    // 程序代码
 }catch(异常类型2 异常的变量名2){
    // 程序代码
 }

ข้อมูลโค้ดข้างต้นมีสามจับบล็อก

คุณสามารถเพิ่มจำนวนของการจับบล็อกใด ๆ ที่อยู่เบื้องหลังคำสั่งลอง

หากเกิดข้อยกเว้นในรหัสป้องกันยกเว้นจะโยนไปจับบล็อกแรก

ถ้าคุณโยนข้อยกเว้นชนิดข้อมูลที่ไม่ตรงกันของ ExceptionType1 ที่มันจะถูกจับ

ถ้าไม่ได้ก็จะถูกโอนไปจับบล็อกที่สอง

ดังนั้นจนกว่าข้อยกเว้นที่ถูกจับได้โดยการจับหรือบล็อกใด ๆ

ตัวอย่าง

ตัวอย่างนี้แสดงให้เห็นว่าการใช้หลายลอง / จับ

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

พ่นคำ / โยน:

หากวิธีการไม่จับข้อยกเว้นการตรวจสอบแล้ววิธีการที่จะต้องใช้พ่นคำหลักที่จะประกาศ โยนคำหลักที่วางไว้ในตอนท้ายของลายเซ็นของวิธีการ

นอกจากนี้คุณยังสามารถใช้คำหลักโยนโยนข้อยกเว้นไม่ว่าจะเป็นใหม่หรือใหม่ instantiated จับ

ประกาศวิธีการต่อไปพ่นยกเว้น RemoteException:

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

วิธีการสามารถประกาศที่จะโยนข้อยกเว้นหลายคั่นด้วยเครื่องหมายจุลภาคระหว่างหลายข้อยกเว้น

ยกตัวอย่างเช่นการประกาศวิธีการต่อไปพ่น RemoteException และ InsufficientFundsException:

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

คำหลักในที่สุด

ในที่สุดคำหลักที่ใช้ในการสร้างบล็อกรหัสหลังจากการป้องกันรหัสพยายามที่จะทำการ

หรือไม่ข้อยกเว้นเกิดขึ้นในที่สุดรหัสบล็อกจะถูกดำเนินการ

ในบล็อกสุดท้ายคุณก็สามารถเรียกใช้ทำความสะอาดผลพวงของลักษณะของประเภทของคำสั่งสิ้นสุดที่

ในที่สุดก็ปรากฏในบล็อกบล็อกจับในที่สุดไวยากรณ์เป็นดังนี้:

 try{
    // 程序代码
 }catch(异常类型1 异常的变量名1){
    // 程序代码
 }catch(异常类型2 异常的变量名2){
    // 程序代码
 }finally{
    // 程序代码
 }
 

ตัวอย่าง

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

ตัวอย่างข้างต้นรวบรวมผลมีดังนี้

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

โปรดทราบว่าเรื่องดังต่อไปนี้:

  • จับไม่สามารถอยู่ได้เป็นอิสระจากความพยายาม
  • ในลอง / จับบล็อกไม่ได้เพิ่มเข้ามาหลังจากความต้องการในที่สุดก็บังคับ
  • ไม่ได้หลังจากลองจับบล็อกก็ไม่ปิดกั้นในที่สุด
  • ลองจับในที่สุดก็ไม่สามารถเพิ่มรหัสใด ๆ ระหว่างบล็อก

ยกเว้นที่กำหนดเองคำสั่ง

ใน Java คุณสามารถกำหนดข้อยกเว้น จุดต่อไปนี้ต้องจำไว้ในการเขียนข้อยกเว้นการเรียนของคุณเอง

  • ข้อยกเว้นทั้งหมดจะต้อง subclasses Throwable
  • หากคุณต้องการที่จะเขียนชั้นยกเว้นการตรวจสอบคุณจะต้องรับช่วงชั้นข้อยกเว้น
  • หากคุณต้องการที่จะเขียนชั้นยกเว้น Runtime คุณจะต้องรับช่วงชั้น RuntimeException

คุณสามารถกำหนดระดับข้อยกเว้นของคุณเองเช่นนี้

class MyException extends Exception{
}

เพียงระดับข้อยกเว้นสืบทอดการสร้างคลาสยกเว้นมีการตรวจสอบการเรียนการยกเว้น

ชั้น InsufficientFundsException ต่อไปนี้เป็นผู้ใช้กำหนดระดับยกเว้นที่สืบทอดจากข้อยกเว้น

ยกเว้นชั้นและชั้นเรียนอื่น ๆ ประกอบด้วยตัวแปรและวิธีการ

ตัวอย่าง

// 文件名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;
   }
}

แสดงให้เห็นถึงวิธีการใช้งานระดับข้อยกเว้นของเราเอง

ในคลาส CheckingAccount ต่อไปนี้ประกอบด้วยถอน () วิธีการพ่น InsufficientFundsException ข้อยกเว้น

// 文件名称 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;
   }
}

โปรแกรมต่อไปนี้แสดงให้เห็นถึงวิธีการเรียกเงินฝากระดับ BankDemo CheckingAccount () และถอน () วิธีการ

//文件名称 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();
      }
    }
}

รวบรวมข้อสามไฟล์และทำงาน BankDemo โปรแกรมที่ได้รับผลดังต่อไปนี้:

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)

ข้อยกเว้นทั่วไป

มันกำหนดสองประเภทของข้อยกเว้นและข้อผิดพลาดในชวา

  • JVM (โปรแกรม Java Virtual Machine) ยกเว้นข้อยกเว้นโยนโดย JVM หรือข้อผิดพลาด ตัวอย่างเช่นระดับ NullPointerException ชั้น ArrayIndexOutOfBoundsException ชั้น ClassCastException
  • ยกเว้นระดับโปรแกรม: โปรแกรม API โดยโปรแกรมหรือโยน สำหรับการเรียน IllegalArgumentException ตัวอย่างเช่นระดับ IllegalStateException