2017-09-07 19 views
5

Tôi có một ParentClass trong một JAR, nhưng không phải mã nguồn. Tôi đang thực hiện một SubClass, nhưng tôi cần phải xử lý một số trường hợp góc.Có thể tiếp tục thực thi Java sau khi ngoại lệ không?

class ParentClass { 
    void foo() { 
     … // lots of code 1 
     ; // can possibly throw NullPointerException 
     … // lots of code 2 
    } 
} 
class SubClass extends ParentClass { 
    @Override 
    void foo() { 
     try {super.foo();} 
     catch(NullPointerException npe) {… /*handle exception*/} 
     finally {… /* resume lots of code 2 ? */} 
    } 
} 

Có cách nào để chạy phần //lots of code 2 sau khi xử lý ngoại lệ trong phương pháp ghi đè không? Tôi không muốn lặp lại mã, và không thể sửa đổi ParentClass.

P.S: Vấn đề NullPointerException không có trong ParentClass. Nhưng do một sự khởi tạo khác trong SubClass, vấn đề này có thể phát sinh.

+5

Bạn không thể. Hãy thử giải quyết NPE, thay vào đó ... –

+1

Bạn thường nên sửa NPE thay vì bắt chúng. – khelwood

+3

"Nhưng do một sự khởi tạo khác trong SubClass, vấn đề này có thể phát sinh." Khắc phục sự kiện khác nhau trong 'SubClass'. –

Trả lời

3

No.

Bạn không thể quay lại vào giữa phương thức.

Nếu bạn không muốn sao chép-dán mã trong đó (gọi tốt!), Bạn phải đặt mã được chia sẻ vào một phương pháp riêng biệt mà lớp con của bạn có thể gọi.

Hoặc bạn có thể đặt phần có thể ném NullPointerException vào một phương thức riêng biệt và ghi đè nó trong lớp con (để nó không còn ném).

Nhưng do sự khởi tạo khác trong SubClass, vấn đề này có thể phát sinh.

Có thể bạn hoàn toàn tránh được ngoại lệ bằng cách thay đổi cách bạn thực hiện việc khởi tạo này? Có thể cung cấp một "đối tượng giả" cho điều hiện tại là null? Cái gì đó không làm bất cứ điều gì có hại, nhưng ngăn cản ngoại lệ?

+0

Cảm ơn! Có vẻ như tôi cần phải "hack" theo cách của tôi xung quanh giới hạn này bằng cách tạo ra các công cụ giả và sau đó ghi đè với nội dung thực tế. '@Override void foo() {super.ref = new Object(); super.foo(); super.ref = null; this.ref.doSomething();} 'Tôi muốn nó null vì tôi muốn là ngữ nghĩa trong mã của tôi. – garyF

2

Như những người khác đã chỉ ra, bạn không thể di chuyển trở lại đó. Tuy nhiên, bạn có thể có thể refactorParent.foo() một cái gì đó như thế này:

class ParentClass { 
    protected void foo() { // made it protected so it's overridable 
     stuffBeforeNPE(); // Extract Method Refactoring 
     codeWithPossiblyNPE(); // Extract Method Refactoring 
     stuffAfterNPE(); // Extract Method Refactoring 
    } 

    protected void stuffBeforeNPE() { ... } // you might want to add params and return values 
    protected void codeWithPossiblyNPE() { ... } 
    stuffAfterNPE() { ... } 
} 

Bây giờ, lớp con của bạn có thể trông như thế này:

class SubClass extends ParentClass { 
    @Override 
    protected void foo() { 
     stuffBeforeNPE(); 
     try { 
      codeWithPossiblyNPE(); 
     } catch(NullPointerException npe) { 
      … /*handle exception*/ 
     } 
     stuffAfterNPE(); 
    } 
} 
+1

Phải, đang cập nhật câu trả lời. –

Các vấn đề liên quan