2013-08-29 9 views
9

URI javadocgetPath विधि रिटर्न "इस यूआरआई, या नल के डीकोड पथ घटक यदि पथ अपरिभाषित है" के अनुसार (जोर जोड़ा)। इससे मुझे विश्वास होगा कि अगर मेरा आवेदन getPath के वापसी मूल्य पर निर्भर करता है, तो मुझे यह जांचने की आवश्यकता हो सकती है कि यह null है या नहीं। हालांकि, ऐसा लगता है कि यह कभी नहीं हो सकता है।क्या java.net.URI ऑब्जेक्ट की getPath विधि के लिए यह संभव है कि शून्य न हो? (यदि हां, तो कब?)

निम्नलिखित कोड URI ऑब्जेक्ट बनाने के मेरे प्रयास दिखाता है जिसके लिए getPath शून्य देता है, लेकिन जैसा कि आप देख सकते हैं, मुझे अभी तक ऐसा कोई मामला नहीं मिला है। क्या कोई यह बता सकता है कि यह कैसे हो सकता है?

संपादित करें: यह मेरा ध्यान में आया है कि एक mailto यूआरआई एक रास्ता भी नहीं है। हालांकि, मैं वास्तव में क्या पूछ रहा हूं: क्या कोई यूआरआई हो सकता है जो http, https, ftp, या फ़ाइल स्कीम का उपयोग करता है जिसमें एक अपरिभाषित/शून्य पथ है?

import java.net.URI; 
import java.net.URISyntaxException; 

public class URIGetPathNullTest { 

    public static void main(String []args) throws Exception { 
     test1(); 
     test2(); 
     test3(); 
     test4(); 
     test5(); 
     test6(); 
     test7(); 
    } 


    public static void test1() throws URISyntaxException { 
     String urlString = ""; 
     URI uri = new URI(urlString); 
     printUri(uri); 
     // Output: 
     // toString() --> 
     // getPath --> 
     // getPath null? false   
    } 

    public static void test2() throws URISyntaxException{ 
     String scheme = null; 
     String ssp = null; 
     String fragment = null; 
     URI uri = new URI(
       scheme, 
       ssp, 
       fragment 
      ); 
     printUri(uri);  
     // Output: 
     // toString() --> 
     // getPath --> 
     // getPath null? false 
    } 

    public static void test3() throws URISyntaxException { 
     String scheme = null; 
     String userInfo = null; 
     String host = null; 
     int port = -1; 
     String path = null; 
     String query = null; 
     String fragment = null; 
     URI uri = new URI(
       scheme, 
       userInfo, 
       host, 
       port, 
       path, 
       query, 
       fragment    
      ); 
     printUri(uri);  
     // Output: 
     // toString() --> 
     // getPath --> 
     // getPath null? false 

    } 

    public static void test4() throws URISyntaxException { 
     String scheme = null; 
     String host = null; 
     String path = null; 
     String fragment = null; 
     URI uri = new URI(
       scheme, 
       host, 
       path, 
       fragment    
      ); 
     printUri(uri);  
     // Output: 
     // toString() --> 
     // getPath --> 
     // getPath null? false 
    } 

    public static void test5() throws URISyntaxException { 
     String scheme = null; 
     String authority = null; 
     String path = null; 
     String query = null; 
     String fragment = null; 
     URI uri = new URI(
       scheme, 
       authority, 
       path, 
       query, 
       fragment    
      ); 
     printUri(uri);  
     // Output: 
     // toString() --> 
     // getPath --> 
     // getPath null? false 
    } 

    public static void test6() throws URISyntaxException { 
     String urlString = "?some-query"; 
     URI uri = new URI(urlString); 
     printUri(uri); 
     // Output: 
     // toString() --> ?some-query 
     // getPath --> 
     // getPath null? false   
    } 

    public static void test7() throws URISyntaxException { 
     String urlString = "#some-fragment"; 
     URI uri = new URI(urlString); 
     printUri(uri); 
     // Output: 
     // toString() --> #some-fragment 
     // getPath --> 
     // getPath null? false   
    } 

    public static void printUri(URI uri) { 
     System.out.println("toString() --> " + uri.toString()); 
     System.out.println("getPath --> " + uri.getPath()); 
     System.out.println("getPath null? " + (uri.getPath() == null)); 
    } 
} 

उत्तर

13

मैं RFC2956 से अधिक पढ़ने और पाया है कि मैं केवल http/एफ़टीपी/फ़ाइल योजनाओं के लिए इसी यूआरआई की सोच रहा था था। एक mailto यूआरआई एक उदाहरण है जिसमें पथ नहीं है।

public static void test8() throws URISyntaxException { 
    String urlString = "mailto:[email protected]"; 
    URI uri = new URI(urlString); 
    printUri(uri); 
    // Output: 
    // toString() --> mailto:[email protected] 
    // getPath --> null 
    // getPath null? true   
} 

संपादित: news योजना के साथ इसी तरह।

एक अपारदर्शी यूआरआई एक निरपेक्ष यूआरआई जिसकी योजना-विशिष्ट है:

public static void test9() throws URISyntaxException { 
    String urlString = "news:comp.infosystems.www.servers.unix"; 
    URI uri = new URI(urlString); 
    printUri(uri); 
    // Output: 
    // toString() --> news:comp.infosystems.www.servers.unix 
    // getPath --> null 
    // getPath null? true   
} 

the beginning of the URI javadoc पर एक अच्छा संकेत नहीं है (मैं नीचे मेरे अन्य जवाब संयोजित कर दी है) भाग स्लैश वर्ण ('/') से शुरू नहीं होता है। ओपेक यूआरआई आगे पार्सिंग के अधीन नहीं हैं। अपारदर्शी यूआरआई के कुछ उदाहरण हैं:

mailto: [email protected]
खबर: comp.lang.java
कलश: ISBN: 096139210x

ऐसा लगता है कि getPath रिटर्न शून्य अगर और केवल URI अपारदर्शी है, जो isOpaque method के साथ जांचना आसान है। इसलिए यदि मैं सुनिश्चित करता हूं कि यूआरआई अपारदर्शी नहीं है तो मुझे के null के परिणाम की जांच करने की आवश्यकता नहीं है।

openjdk 7-b147 में source for java.net.URI को देखते हुए, मैं path क्षेत्र द्वारा एक टिप्पणी देखा तो isOpaque के लिए स्रोत को देखा है, जो इस बात की पुष्टि करने लगता है:

private transient String path; // null ==> opaque 

// ... 

public boolean isOpaque() { 
    return path == null; 
} 
+1

अच्छा एक। मैंने कुछ नया सीखा है। धन्यवाद। :) –

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

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