2016-12-01 47 views
1

閱讀資源時,目前安全地獲取從資源文件text(適當的異常而不是NPE)我需要使用下面的代碼片段:例外,而不是空在Groovy

String resourceText(String resourcePath) { 
    URL resource = this.getClass().getResource(resourcePath) 
    if (!resource) { 
     throw new IllegalArgumentException("No file at $resourcePath") 
    } 
    resource.text 
} 

是否有任何庫那已經完全是這樣嗎?它看起來應該總是以這種安全的方式訪問資源。

+0

爲什麼不?'資源.text'或'Optional.ofNullable(資源)'? – Opal

+0

我自己找到了更好的方法,現在我會回覆。無論如何,謝謝:) –

回答

1

爲了避免NPE可以使用safe navigation operator,返回值將被評估爲null:

String resourceText(String resourcePath) { 
    URL resource = this.getClass().getResource(resourcePath) 
    resource?.text 
} 

更好的選擇是使用選配:

String resourceText(String resourcePath) { 
    URL resource = this.getClass().getResource(resourcePath) 
    Optional.ofNullable(resource).orElseThrow(() -> new IllegalArgumentException("No file at $resourcePath")).text 
} 
+0

第一個片段正是我想要避免的(我不想返回null),而第二個片段很好,但不會更短,並且使用Java 8功能。對於Java 7來說也不錯。 –

0

我發現,使用番石榴該方法可以大大縮短:

String resourceText(String resourcePath) { 
    Resources.getResource(this.class, resourcePath).text 
} 

從它的Javadoc:

@throws IllegalArgumentException if the resource is not found

+0

引擎蓋下的番石榴是完全一樣的!即使不替換5行代碼,添加整個依賴關係似乎也沒有意義。 – Opal

+0

當然,但是在我與番石榴一起工作的大多數項目中,無論如何都是添加的。而且,在項目中重複數十次的這5行代碼可能會要求提取到單獨的類/ util(至少要有統一的錯誤消息),並且您需要爲每個項目單獨執行。通過使用Guava,您可以統一的方式訪問跨所有項目的資源,而無需太多考慮。 –