2013-03-25 13 views
31

मैंने इस कोड को पढ़ा जहां इंटरफ़ेस अपवाद फेंकता है, लेकिन जिस वर्ग को लागू करता है वह एक को फेंक नहीं देता है या पकड़ता है, वह क्यों है? क्या यह जावा में कानूनी या सुरक्षित है?जावा इंटरफ़ेस एक अपवाद फेंकता है लेकिन इंटरफ़ेस कार्यान्वयन अपवाद नहीं फेंकता है?

import java.rmi.*; 
public interface MyRemote extends Remote { 
    public String sayHello() throws RemoteException; 
} 

import java.rmi.*; 
import java.rmi.server.*; 
public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote{ 
    public String sayHello() { 
     return "Server says, 'Hey'"; 
    } 
    public MyRemoteImpl() throws RemoteException {} 
    public static void main (String[] args) { 
     try { 
      MyRemote service = new MyRemoteImpl(); 
      Naming.rebind("RemoteHello", service); 
     } catch(Exception ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
} 
+2

आप http://www.coderanch.com/t/399874/java/java/Methods-throwing-Exception-Interface –

+2

पर चर्चा को देखना चाहेंगे हां यह कानूनी है। और आपको लिंक चैटर पोस्ट करना चाहिए, और उसे इसे उत्तर के रूप में भी पोस्ट किया जाना चाहिए .. – Thihara

+0

धन्यवाद थिहारा। ऐसा किया है –

उत्तर

47

लागू करने और विस्तार का एक सामान्य नियम है कि आप अपने नए वर्ग या इंटरफ़ेस "कम प्रतिबंधक" लेकिन "अधिक प्रतिबंधात्मक" नहीं कर सकते हैं। यदि आप एक प्रतिबंध के रूप में अपवाद को संभालने की आवश्यकता के बारे में सोचते हैं, तो एक अपॉइंटमेंट जो अपवाद की घोषणा नहीं करता है वह कम प्रतिबंधित है। इंटरफ़ेस को कोड करने वाले किसी भी व्यक्ति को आपकी कक्षा में परेशानी नहीं होगी।

— स्टेन जेम्स


http://www.coderanch.com/t/399874/java/java/Methods-throwing-Exception-Interface

+1

स्पष्ट स्पष्टीकरण के लिए धन्यवाद। समझ में आता है –

11

एक जावा विधि एक माता पिता के वर्ग में एक और ओवरराइड करता है, या लागू करता है एक विधि एक अंतरफलक में परिभाषित हैं पर चर्चा के भाग के रूप में, यह अतिरिक्त चेक अपवाद फेंक नहीं सकते हैं, लेकिन यह कम फेंक सकता है।

public class A { 
    public void thrower() throws SQLException {...} 
} 

public class B extends A { 
    @Override 
    public void thrower() throws SQLException, RuntimeException, NamingException {...} 
} 

SQLException ठीक है; इसे ओवरराइड विधि में घोषित किया गया है। इसे SerialException जैसे सबक्लास द्वारा प्रतिस्थापित किया जा सकता है।

RuntimeException ठीक है; उनको कहीं भी इस्तेमाल किया जा सकता है।

NamingException अवैध है। यह RuntimeException नहीं है, और A की सूची में नहीं है, यहां तक ​​कि एक उप प्रकार के रूप में भी।

संबंधित मुद्दे