2010-10-15 41 views
40

Bất kỳ bạn có thể giải thích sự khác biệt giữa throw, throwsThrowable và thời điểm sử dụng không?Xử lý ngoại lệ: ném, ném và Throwable

+1

Java không có gì. Nó có một phương thức 'throw' của lớp Throwable, và nó có một từ khóa' throws' được sử dụng trên các tiêu đề phương thức. Họ là hai điều khá khác nhau. Quên về 'ném' lúc đầu và chỉ ra những gì 'ném' nào. 'ném 'chỉ là cần thiết để giữ cho trình biên dịch hài lòng. –

Trả lời

68
  • throws: Được sử dụng khi viết phương pháp, tuyên bố rằng phương pháp trong câu hỏi ném xác định (kiểm tra) là ngoại lệ.

    Ngược lại với ngoại lệ đã kiểm tra, ngoại lệ thời gian chạy (NullPointerExceptions v.v.) có thể được ném mà không cần phương thức khai báo throws NullPointerException.

  • throw: Hướng dẫn thực sự ném ngoại lệ. (Hoặc cụ thể hơn, Có thể ném).

    Từ khóa ném được theo sau bởi tham chiếu đến Throwable (thường là ngoại lệ).

Ví dụ:

enter image description here


  • Throwable: Một lớp học mà bạn phải mở rộng để tạo riêng, tùy chỉnh của bạn, Throwable.

Ví dụ:

enter image description here


+0

Để thêm ảnh chụp màn hình vào đoạn mã, hãy +1 cho bạn. Câu trả lời hay. –

+2

+1 để minh hoạ chi tiết và gọn gàng. – 0x6900

+0

Wow, kudo cho lời giải thích chi tiết. – fruqi

1

Throw được sử dụng để ném ngoại lệ, throws (nếu tôi đoán một cách chính xác) được sử dụng để chỉ ra phương pháp mà có thể ném ngoại lệ đặc biệt, và lớp Throwable là lớp cha của tất cả các lỗi và ngoại lệ trong Java

How to Throw Exceptions

2

ném - Nó được sử dụng để ném một tuyên bố Exception.The ném đòi hỏi một cuộc tranh luận duy nhất: một đối tượng lớp Throwable

ném - Đây được sử dụng để xác định rằng phương pháp này có thể ném ngoại lệ

Có thể ném - Đây là lớp cha của tất cả các lỗi và ngoại lệ trong ngôn ngữ Java. bạn chỉ có thể ném những vật thể xuất phát từ lớp Throwable. Throwable chứa một bản chụp của việc thực hiện chồng chủ đề của nó tại thời điểm nó được tạo ra

9
  • throw: tuyên bố để ném đối tượng t nơi t instanceof java.lang.Throwable phải là sự thật.
  • throws: mã thông báo chữ ký phương thức để chỉ định ngoại lệ đã kiểm tra throw n theo phương pháp đó.
  • java.lang.Throwable: loại cha của tất cả các đối tượng có thể được ném (và bị bắt).

See here for a tutorial on using exceptions.

+0

+1 cho câu trả lời dạng viên nang. – 0x6900

5

Điều này thực sự dễ hiểu.

Các java.lang.Throwable:

Lớp Throwable là các lớp cha của tất cả các lỗi và ngoại lệ trong ngôn ngữ Java. Chỉ có đối tượng là trường hợp của lớp học này (hoặc một trong các lớp con của nó) là được ném bởi Máy ảo Java hoặc có thể được ném bởi câu lệnh Java throw. Tương tự, chỉ lớp này hoặc một trong số các lớp con của nó có thể là đối số nhập vào mệnh đề catch. More

Các từ khóa ném được sử dụng trong phương pháp kê khai, điều này xác định loại ngoại lệ [lớp Throwable] chúng ta có thể mong đợi từ phương pháp này.

Từ khóa ném được sử dụng để ném một đối tượng là thể hiện của lớp Throwable.


Kẻo thấy một số ví dụ:

Chúng tôi tạo ra ourself một lớp ngoại lệ

public class MyException super Exception { 

} 

Các chúng ta tạo ra một phương pháp mà tạo ra một đối tượng từ lớp ngoại lệ của chúng tôi và ném nó sử dụng từ khóa ném.

private void throwMeAException() throws MyException //We inform that this method throws an exception of MyException class 
{ 
    Exception e = new MyException(); //We create an exception 

    if(true) { 
    throw e; //We throw an exception 
    } 
} 

Khi chúng ta sẽ sử dụng phương pháp throwMeAException(), chúng tôi buộc phải chăm sóc nó một cách cụ thể bởi vì chúng tôi có những thông tin mà nó ném một cái gì đó, trong trường hợp này, chúng tôi có ba tùy chọn.

Đầu tiên lựa chọn là sử dụng khối try và catch để xử lý các ngoại lệ:

private void catchException() { 

    try { 
    throwMeAException(); 
    } 
    catch(MyException e) { 
    // Here we can serve only those exception that are instance of MyException 
    } 
} 

tùy chọn thứ hai là phải vượt qua các ngoại lệ

private void passException() throws MyException { 

     throwMeAException(); // we call the method but as we throws same exception we don't need try catch block. 

    } 

tùy chọn thứ ba là để bắt và tái ném ngoại lệ

private void catchException() throws Exception { 

    try { 
    throwMeAException(); 
    } 
    catch(Exception e) { 
     throw e; 
    } 
} 

Tiếp tục, khi bạn cần dừng một số hành động, bạn có thể ném ngoại lệ sẽ quay lại cho đến khi không phải là máy chủ bởi một số khối try-catch. Bất cứ nơi nào Bạn sử dụng phương pháp ném một ngoại lệ Bạn nên xử lý nó bằng khối try-catch hoặc thêm các khai báo vào các phương thức của bạn.

Ngoại lệ của quy tắc này là java.lang.RuntimeException những quy tắc này không phải được khai báo. Đây là một câu chuyện khác như là khía cạnh của việc sử dụng ngoại lệ.

+0

Ví dụ hay. Cảm ơn thời gian và nỗ lực của bạn trong việc giải thích cho tôi điều này. – Sumithra

1

Ném:

được sử dụng để thực sự ném ngoại lệ, trong khi ném là khai báo cho phương pháp này. Họ không thể hoán đổi cho nhau.

throw new MyException("Exception!); 

Ném:

này được sử dụng khi bạn không sử dụng câu lệnh catch trong mã của bạn nhưng bạn biết rằng lớp học đặc biệt này có khả năng ném vậy và như vậy ngoại lệ (chỉ kiểm tra ngoại lệ). Trong này, bạn không sử dụng try catch block nhưng viết bằng cách sử dụng mệnh đề throw tại điểm thích hợp trong mã của bạn và ngoại lệ được ném cho người gọi phương thức và được xử lý bởi nó. Ngoài ra các từ khóa ném được sử dụng khi chức năng có thể ném một ngoại lệ kiểm tra.

public void myMethod(int param) throws MyException 
-1

Cùng câu trả lời như trên nhưng với copy-paste niềm vui:

public class GsonBuilderHelper { 
    // THROWS: method throws the specified (checked) exception 
    public static Object registerAndRun(String json) throws Exception { 

     // registering of the NaturalDeserializer 
     GsonBuilder gsonBuilder = new GsonBuilder(); 
     gsonBuilder.registerTypeAdapter(Object.class, new NaturalDeserializer()); 
     Gson gson = gsonBuilder.create(); 

     Object natural = null; 
     try { 
      // calling the NaturalDeserializer 
      natural = gson.fromJson(json, Object.class); 
     } catch (Exception e) { 
      // json formatting exception mainly 
      Log.d("GsonBuilderHelper", "registerAndRun(json) error: " + e.toString()); 
      throw new Exception(e); // <---- THROW: instance of class Throwable. 
     } 
     return natural; 
    } 
} 
1

Throwable : trong Java, tất cả của lỗi và lớp execption của đang drieved từ lớp java.lang.Throwable. Nó là đầu của hệ thống phân cấp của các lớp lỗi và ngoại lệ. Chỉ các đối tượng là các cá thể của lớp này (hoặc một trong các lớp con của nó) được ném bởi Máy ảo Java hoặc có thể được ném bởi câu lệnh Java throw.

Throws: là công cụ sửa đổi sau phương pháp và chỉ định phương pháp nào có thể được thực thi. Nếu chúng được kiểm tra ngoại lệ, trình biên dịch sẽ đảm bảo mã gọi phương thức đó phải bắt các ngoại lệ được kiểm tra này.

Throw: tuyên bố được sử dụng để ném lỗi hoặc ngoại lệ. câu lệnh throw yêu cầu một đối số duy nhất: một cá thể của bất kỳ lớp con nào của lớp Throwable hoặc lớp Throwable. Việc thực thi lệnh throw sẽ kích hoạt JVM để ném ngoại lệ này và gây ra một ngoại lệ xảy ra.

1

Danh sách vài ...

Ném

  1. Java throw từ khóa được sử dụng để rõ ràng throw một ngoại lệ.
  2. Ngoại lệ được kiểm tra không thể được truyền bá chỉ sử dụng throw.
  3. Throw được theo sau bởi một phiên bản.
  4. Throw được sử dụng trong phương pháp.
  5. Bạn không thể throw nhiều ngoại lệ.

Ném

  1. Java throws từ khóa được sử dụng để khai báo một ngoại lệ.
  2. Ngoại lệ được kiểm tra có thể được nhân giống với throws.
  3. Throws được theo sau bởi lớp học.
  4. Throws được sử dụng với chữ ký phương thức.
  5. Bạn có thể khai báo nhiều ngoại lệ ví dụ: public void method()throws IOException,SQLException
0

Có 2 loại chính của Exceptions:
Runtime Exceptions (đánh dấu): ví dụ. NullPointerException, ClassCastException, ..
Ngoại lệ đã kiểm tra: ví dụ: FileNotFoundException, CloneNotSupportedException, ..

Trường hợp ngoại lệ thời gian chạy là ngoại lệ xảy ra trong thời gian chạy và nhà phát triển không nên cố gắng nắm bắt hoặc dừng nó. Bạn chỉ viết mã để tránh chúng hoặc ra lệnh ném, khi tiêu chí lỗi được đáp ứng. Chúng tôi sử dụng ném bên trong cơ thể phương pháp.

public Rational(int num, int denom){ 
if(denom <= 0) { 
    throw new IllegalArgumentException("Denominator must be positive"); 
} 
this.num=num; 
this.denom=denom; 
} 

Tuy nhiên đối với trường hợp ngoại lệ Kiểm tra, JVM hy vọng bạn để xử lý nó và sẽ cung cấp cho lỗi biên dịch nếu không được xử lý, do đó bạn tuyên bố rằng nó ném kiểu của ngoại lệ như bên dưới trong phương pháp clone().

Class Employee{ 
public Employee clone() throws CloneNotSupportedException{ 
    Employee copy = (Employee)super.clone(); 
    copy.hireDate = (Date)hireDate.clone(); 
    return copy; 
} 
} 
Các vấn đề liên quan