2010-12-30 38 views
9

nói rằng tôi có sauJava: bắt ngoại lệ cụ thể

try{ 
//something 
}catch(Exception generic){ 
//catch all 
}catch(SpecificException se){ 
//catch specific exception only 
} 

Điều gì sẽ xảy ra khi nó đi qua SpecificException? Liệu nó bắt nó như là một ngoại lệ chung đầu tiên, và sau đó bắt các specificexception?

Hoặc nó chỉ bắt ngoại lệ cụ thể trong khi bỏ qua ngoại lệ chung chung.

Tôi không muốn bị bắt cả hai loại chung chung và đặc biệt.

+0

Câu hỏi chứa mã sẽ tạo ra lỗi thời gian biên dịch. Ngoại lệ chung nên sau khi ngoại lệ cụ thể. –

Trả lời

10

Không. Tất cả ngoại lệ sẽ bị chặn bởi khối đầu tiên. Thứ hai sẽ không bao giờ đạt được (mà trình biên dịch nhận ra, dẫn đến lỗi do mã không truy cập được). Nếu bạn muốn điều trị SpecificException đặc biệt, bạn phải làm điều đó theo chiều ngược lại:

}catch(SpecificException se){ 
//catch specific exception only 
}catch(Exception generic){ 
//catch all 
} 

Sau đó SpecificException sẽ bị bắt bởi khối đầu tiên, và tất cả những người khác bằng cách thứ hai.

+2

Tôi không hiểu tại sao đây là câu trả lời được chấp nhận. Cố gắng nắm bắt ngoại lệ theo thứ tự được hiển thị trong câu hỏi ban đầu dẫn đến lỗi biên dịch, do đó, câu lệnh "Tất cả ngoại lệ sẽ bị chặn bởi khối đầu tiên" không áp dụng. –

+0

đã được kiểm tra với javac chưa? Trong nhật thực nó không thành công, nhưng javac chỉ có thể đưa ra một cảnh báo. – Bozho

+0

Tôi nghĩ Michael đã đề cập đến mã mà anh ta đăng, trong trường hợp đó, tuyên bố của anh ấy là chính xác. – duffymo

21

Điều này sẽ không biên dịch. Bạn sẽ được thông báo rằng khối ngoại lệ cụ thể không thể truy cập được.

Trước tiên bạn phải có khối bắt ngoại lệ cụ thể hơn, tiếp theo là khối chung.

try 
{ 
    //something 
} 
catch(SpecificException se) 
{ 
    //catch specific exception only 
} 
catch(Exception generic) 
{ 
    //catch all 
} 
+0

Hãy tưởng tượng rằng trình biên dịch cho phép chúng tôi viết ngoại lệ theo bất kỳ thứ tự nào. Nó đã tạo ra sự khác biệt gì ? Tôi không thấy bất kỳ sự khác biệt nào. Sau đó, tại sao thực thi một đơn đặt hàng? –

+0

Hãy tưởng tượng rằng tôi là một người đàn ông giàu có, trẻ hơn 20 tuổi. nó đã tạo ra sự khác biệt gì? Hãy tưởng tượng tất cả những gì bạn muốn, nhưng đó là cách JDK hoạt động. – duffymo

+0

Với logic đó, tại sao thậm chí bận tâm tìm lý do cho bất cứ điều gì? Tại sao java không cho phép đa thừa kế? Ai quan tâm ? Nó chỉ hoạt động theo cách đó. Xem điểm tôi đang cố gắng thực hiện? Vâng, câu hỏi của tôi không quan trọng hay quan trọng. Nhưng nó sẽ là tốt đẹp để biết câu trả lời. Chenqui. –

6

này không biên dịch với trình biên dịch thực:

khối catch Unreachable cho IOException. Nó đã được xử lý bởi khối catch cho Exception

Vì vậy hãy xác định chúng theo cách khác. Chỉ một người cụ thể sẽ bị bắt.

1

Là một lưu ý phụ, cách duy nhất để có cả hai khối catch được gọi là sử dụng các ngoại lệ lồng nhau.

try { 
    try{ 
    //something 
    }catch(SpecificException se){ 
    //catch specific exception only 
    throw se; 
    } 
}catch(Exception generic){ 
//catch all 
} 
3

Các khối catch được thử theo thứ tự và khối bắt đầu khớp với loại ngoại lệ được thực hiện. Vì Exception là siêu lớp của tất cả các loại ngoại lệ, nó sẽ luôn được thực hiện trong trường hợp này và các trường hợp cụ thể sẽ không bao giờ được thực thi. Trong thực tế, trình biên dịch đủ thông minh để nhận thấy điều này và đưa ra một lỗi biên dịch.

Chỉ cần sắp xếp lại các điều khoản bắt.

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