2010-03-23 31 views
5

Tôi có 3 dòng sau của mã:Tôi nên làm gì nếu một IOException được ném?

ServerSocket listeningSocket = new ServerSocket(earPort); 
Socket serverSideSocket = listeningSocket.accept(); 
BufferedReader in = new BufferedReader(new InputStreamReader(serverSideSocket.getInputStream())); 

Trình biên dịch phàn nàn về tất cả 3 dòng này và phàn nàn của nó là như nhau cho tất cả 3 dòng: không được báo cáo ngoại lệ java.io.IOException; Chi tiết hơn, những ngoại lệ này được ném bởi new ServerSocket, accept()getInputStream().

Tôi biết mình cần sử dụng try ... catch .... Nhưng vì điều đó tôi cần phải biết những ngoại lệ này có ý nghĩa gì trong mọi trường hợp cụ thể (tôi nên giải thích chúng như thế nào). Khi chúng xảy ra? Ý tôi là, không phải nói chung, nhưng trong 3 trường hợp đặc biệt này.

Trả lời

5

Bạn không biết IN THAM GIA vì IO Ngoại lệ cũng là ngoại lệ "chung chung" có thể có nhiều nguyên nhân về mặt kỹ thuật. Nó có nghĩa là một vấn đề bất ngờ xung quanh đầu vào/đầu ra xảy ra, nhưng rõ ràng nó có nguyên nhân khác nhau trên đĩa cứng địa phương hơn trên internet.

Nói chung, cả ba mục đều giải quyết xung quanh ổ cắm. Vì vậy, các nguyên nhân có liên quan đến các vấn đề về mạng. Có thể là:

  • Không có mạng nào cả, thậm chí không phải localhost (sẽ là vấn đề kỹ thuật nghiêm trọng).
  • Cổng đã được sử dụng, khi có số cổng (ổ cắm máy chủ mới) (earPort))
  • Sự cố mạng - ví dụ: somseone vấp phải cáp trong một số nội dung. Cũng có thể là nguyên nhân gây ra chất lượng kém, tấn công DDOS, v.v.
  • Mất cảng - không có cổng phía máy khách cho kết nối mới.

Về cơ bản quanh dòng này.

Điều tương tự sẽ xảy ra hoặc có thể xảy ra bất cứ khi nào bạn thực sự làm điều gì đó với luồng.

Trong thi scase bạn ahve hai có thể nguyên nhân chính:

  • Dòng đầu tiên: các ổ cắm đã được sử dụng (chương trình bắt đầu 2 lần, cùng một cổng như chương trình khác). Điều này rõ ràng là không thể sửa chữa bình thường trừ khi người dùng làm điều gì đó.
  • Lỗi thời gian chạy chung sau này. Điều này có thể xảy ra trong các hoạt động bình thường.
+0

+1 Đây là cốt lõi của câu trả lời. Hãy suy nghĩ về những gì có thể đi sai. API cho bạn biết rằng nó sẽ không luôn luôn hoạt động vì những lý do ngoài tầm kiểm soát của bạn. Bạn muốn xử lý tình trạng lỗi đó như thế nào? Một khi bạn biết câu trả lời cho câu hỏi đó, bạn sẽ biết những gì bạn muốn làm để đáp ứng trình biên dịch. – Yishai

1

Cách đơn giản nhất là để khai báo phương pháp gọi điện thoại của bạn để ném IOException, nhưng bạn cần phải dọn dẹp các nguồn lực được phân bổ trong finally khoản trước khi bạn rời khỏi phương pháp của bạn:

public void doSession () throws IOException 
{ 
    final ServerSocket listeningSocket = new ServerSocket(earPort); 

    try 
    { 
    final Socket serverSideSocket = listeningSocket.accept(); 

    try 
    { 
     final BufferedReader in = 
     new BufferedReader(
      new InputStreamReader(
      serverSideSocket.getInputStream() 
     ) 
     ); 
    } 
    finally 
    { 
     serverSideSocket.close() 
    } 
    } 
    finally 
    { 
    listeningSocket.close() 
    } 
} 
1

Nói chung nó không quan trọng chính xác những gì gây ra IOException ban đầu bởi vì có rất ít ứng dụng của bạn có thể làm để sửa tình hình.

Tuy nhiên, như một câu trả lời chung cho câu hỏi của bạn về "phải làm gì" Bạn có một vài tùy chọn.

  • Try Again-tháng việc nếu vấn đề là không liên tục. Hãy nhớ cung cấp một điều kiện break trong trường hợp nó không.
  • Hãy thử thứ gì đó khác - Tải tài nguyên từ một vị trí khác hoặc thông qua một phương pháp khác.
  • Tặng - Ném/rút lại ngoại lệ và/hoặc hủy bỏ hành động hoặc có thể toàn bộ chương trình. Bạn có thể muốn cung cấp một thông điệp thân thiện với người dùng tại thời điểm này ... ;-) Nếu chương trình của bạn yêu cầu đầu vào hoạt động thì không có đầu vào khiến bạn ít lựa chọn nhưng không hoạt động.
Các vấn đề liên quan