nullreferenceexception,是否需要去閱讀源代碼
nullreferenceexception,是否需要去閱讀源代碼
正文
文章目錄
- nullreferenceexception是否需要去閱讀源代碼?
- Java如何實(shí)現(xiàn)自動關(guān)閉資源?
- 為什么會出現(xiàn)未將對象引用設(shè)置到對象的實(shí)例?
- 裝pageAdmin時(shí)出現(xiàn)錯(cuò)誤?
- 的區(qū)別在哪?
nullreferenceexception是否需要去閱讀源代碼?
閱讀源碼是每個(gè)安防開發(fā)工程師的必經(jīng)之路那么這篇文章就來講解下為什么要閱讀源碼以及如何閱讀源碼。
首先來說下為什么要讀源碼有學(xué)習(xí)源碼的必要嗎?
為什么要閱讀源碼?
關(guān)于為什么閱讀和學(xué)習(xí)源碼我個(gè)人認(rèn)為可能有以下幾點(diǎn):
(一)吊打面試官應(yīng)對面試
為了找到更好的工作應(yīng)對面試因?yàn)樵诿嬖囍锌隙〞柕皆创a級別的問題比如:為什么 HashMap 是線程不安全的?
如果你沒有閱讀過源碼面試官可能會對回答的結(jié)果不滿意進(jìn)而導(dǎo)致面試結(jié)果不太理想但如果你對源碼有所研究并能夠很好地問答面試官的問題這可能就是你的加分點(diǎn)可以形成自己安防的競爭力吊打面試官升職加薪不是夢。
(二)解決問題(bug)
在開發(fā)過程中我們或多或少會遇到 bug比如:在 foreach 循環(huán)里進(jìn)行元素的 remove/add 操作為啥有可能會報(bào) ConcurrentModificationException 異常?
我們可以先在 Google、Stack Overflow 以及對應(yīng)項(xiàng)目的 Issues 里看有沒有類似問題以及解決辦法如果沒有的話我們只能通過閱讀源碼的方式去解決了。如果我們對相關(guān)源碼有所涉獵就可以快速定位到問題所在。
(三)提升編程能力
讀一本好書就是和許多高尚的人談話。 -歌德
和閱讀一本好書一樣閱讀源碼就是和編程大牛面對面交流的機(jī)會在許多安防的開源項(xiàng)目中它們的編碼規(guī)范和架構(gòu)設(shè)計(jì)都是很棒的另外在設(shè)計(jì)上也使用了大量的設(shè)計(jì)模式通過閱讀和學(xué)習(xí)源碼能夠快速提升我們的編碼水平以及對設(shè)計(jì)模式有更深的理解。
同時(shí)在我們閱讀完一個(gè)源碼后可以觸類旁通能夠快速地對其他框架的源碼進(jìn)行閱讀和學(xué)習(xí)減少時(shí)間成本。
除了上述提到的原因之外可能還有許多在這里就不一一贅述了那么在確定了要閱讀源碼之后就讓我們看下如何閱讀源碼吧!
如何閱讀源碼?
如何閱讀源碼取決于你為什么要讀源碼比如:
如果為了應(yīng)對面試那就可以圍繞??嫉幕A(chǔ)類、集合類、隊(duì)列、線程、鎖等內(nèi)容進(jìn)行閱讀和學(xué)習(xí);如果是為了解決 bug那么就可以只圍繞出現(xiàn)問題的相關(guān)類進(jìn)行閱讀分析隨著解決 bug 的增多我相信閱讀的源碼也會越多從而更容易去閱讀和學(xué)習(xí)源碼;
下面大概說下閱讀源碼的幾點(diǎn)建議:
在閱讀之前可以先從開源項(xiàng)目的安防上看它的架構(gòu)設(shè)計(jì)和功能文檔了解這個(gè)項(xiàng)目的整體架構(gòu)、模塊組成以及各個(gè)模塊之間的聯(lián)系。
如果沒有對應(yīng)的項(xiàng)目文檔可以根據(jù)代碼的模塊進(jìn)行梳理以形成對項(xiàng)目的初步了解或者查看已有的源碼解析文章或者書籍在閱讀源碼之前了解項(xiàng)目的架構(gòu)和思路會使閱讀源碼事半功倍。
在了解一個(gè)類的時(shí)候可以使用 ctrl+F12 來查看類中的成員變量和方法。
可以通過 IDEA 的 Diagrams 功能去了解一個(gè)類的繼承關(guān)系。
多打斷點(diǎn)調(diào)試斷點(diǎn)追蹤源碼是很好的閱讀源碼的方式可以先通過 debug 了解下調(diào)用邏輯都和哪些類有關(guān)聯(lián)有大致了解后再通過 debug 了解整體代碼的功能實(shí)現(xiàn)各個(gè)類都起到了什么作用有沒有涉及到設(shè)計(jì)模式等。
另外安防的開源項(xiàng)目中肯定會有許多地方應(yīng)用到了設(shè)計(jì)模式建議在閱讀源碼之前需要對常用的設(shè)計(jì)模式有大致的了解不然閱讀源碼的效率會大大降低。
如果遇到讀不懂某部分源碼的時(shí)候可以先跳過之后再回來看如果屬于搞不懂這部分就茶不思飯不想的人可以在網(wǎng)上找是否有該部分源碼的解析或者文檔也可以自己通過源碼注釋和測試用例去閱讀學(xué)習(xí)。
一般安防的開源項(xiàng)目都會有單元測試可以通過對應(yīng)類的單元測試去了解方法的含義和用法加深對源碼邏輯的理解。
在閱讀源碼的時(shí)候可以在代碼上加上注釋和總結(jié)同時(shí)還可以畫出時(shí)序圖和類圖這樣對閱讀源碼有很大的幫助可以很清楚地知道類之間的調(diào)用關(guān)系和依賴關(guān)系也方便以后回顧重新閱讀。
在這里安防大家一個(gè) IDEA 插件 SequenceDiagram可以根據(jù)源碼生成調(diào)用時(shí)序圖便于閱讀源碼。
剛開始閱讀源碼不建議直接看框架源碼可以先從 jdk 源碼看起:
jdk 源碼也是非常龐大的可以分模塊來閱讀下面是建議的閱讀順序:
java.lang 包下的基本包裝類(Integer、Long、Double、Float 等)還有字符串相關(guān)類(String、StringBuffer、StringBuilder 等)、常用類(Object、Exception、Thread、ThreadLocal 等)。java.lang.ref 包下的引用類(WeakReference、SoftReference 等)java.lang.annotation 包下的注解的相關(guān)類java.lang.reflect 包下的反射的相關(guān)類java.util 包下為一些工具類主要由各種容器和集合類(Map、Set、List 等)java.util.concurrent 為并發(fā)包主要是原子類、鎖以及并發(fā)工具類java.io 和 java.nio 可以結(jié)合著看java.time 主要包含時(shí)間相關(guān)的類可以學(xué)習(xí)下 Java 8 新增的幾個(gè)java.net 包下為網(wǎng)絡(luò)通信相關(guān)的類可以閱讀下 Socket 和 HTTPClient 相關(guān)代碼
其他包下的代碼也可以做下了解JDK源碼閱讀筆記:https://github.com/wupeixuan/JDKSourceCode1.8
再有了一定的源碼閱讀經(jīng)驗(yàn)后可以再去學(xué)習(xí) Spring、Spring Boot、Dubbo、Spring Cloud 等框架的源碼。
總結(jié)
主要介紹了為什么讀源碼以及如何讀源碼供大家參考每個(gè)人都有適合自己的閱讀源碼的方式希望可以在學(xué)習(xí)中去摸索出一套屬于自己的方式。
閱讀源碼不是一蹴而就的這是持久戰(zhàn)只要你能夠堅(jiān)持下來肯定受益匪淺。閱讀源碼的過程比較枯燥可以在社群里一起討論學(xué)習(xí)這樣可能效率更高些。
寫得不好的或者大家有什么更好的建議也歡迎留言討論。
Java如何實(shí)現(xiàn)自動關(guān)閉資源?
1. 為什么要手動關(guān)閉Java資源對象?
首先:解釋Java的資源對象它主要包括IO對象數(shù)據(jù)庫連接對象。比如常見的InputStream、OutputStream、Reader、Writer、Connection、Statement、ResultSet、Socket等等先代碼列舉一個(gè)示例:
FileInputStream f = new FileInputStream("sample.txt");
f.close();//f對象即需要手動關(guān)閉的資源對象
上述代碼中f對象即需要手動關(guān)閉的資源對象。
其次:如果類似的資源對象沒有及時(shí)的手動關(guān)閉這個(gè)對象就會一直占據(jù)內(nèi)存當(dāng)這樣的對象越來越多那內(nèi)存被占用的就會越來越多久而久之就可能造成OutOfMemory俗稱內(nèi)存溢出。
這時(shí)應(yīng)該有人會問Java不是有自己的垃圾回收機(jī)制GC么?不是可以自動回收么?
這個(gè)問題問的好我也一度非常困惑。
安防:首先我們先了解一下GC的原理:
在Java中當(dāng)沒有對象引用指向原先分配給某個(gè)對象的內(nèi)存時(shí)該內(nèi)存便成為垃圾。JVM的一個(gè)系統(tǒng)級線程會自動釋放該內(nèi)存塊。垃圾回收意味著程序不再需要的對象是"無用信息"這些信息將被丟棄。當(dāng)一個(gè)對象不再被引用的時(shí)候內(nèi)存回收它占領(lǐng)的空間以便空間被后來的新對象使用。
首先:GC只能回收內(nèi)存。至于各種stream之類他們下邊一般還開啟了各種其他的系統(tǒng)資源比如文件比如輸入輸出設(shè)備(鍵盤/屏幕等)等等。而這些設(shè)備安防是不能自動關(guān)閉(因?yàn)檎l知道你程序要用它到什么時(shí)候啊)另一個(gè)系統(tǒng)內(nèi)數(shù)量有限(比如鍵盤/屏幕同一時(shí)間只有一個(gè))。安防后文件和數(shù)據(jù)庫連接之類的東西還存在讀寫鎖定的問題。這些都導(dǎo)致用戶必須手動處理這些資源的開啟和關(guān)閉。
其次為了“避免”程序員忘了自己釋放那些資源Java提供了finalizer、PhantomReference之類的機(jī)制來讓程序員向GC注冊“自動回調(diào)釋放資源”的功能。但GC回調(diào)它們的時(shí)機(jī)不確定所以只應(yīng)該作為安防后手段來使用主要手段還是自己關(guān)閉安防好。
PS:關(guān)于GC其實(shí)有很多的知識可以深度挖掘比如各種回收算法finalize()方法等等大家感興趣的話可以自行搜索研究我就不班門弄斧了。
2. 怎樣正確的手動關(guān)閉Java資源對象?
先說一種安防常見的關(guān)閉方式在finally中進(jìn)行關(guān)閉:
FileInputStream f;
try{
f= new FileInputStream("sample.txt");
//something that uses f and sometimes throws an exception
}
catch(IOException ex){
/* Handle it somehow */
}
finally{
f.close();
}
這里在finally中進(jìn)行資源對象關(guān)閉屬于Best Practice。因?yàn)榧词箤ο骹在使用的過程中出現(xiàn)異常也能保證程序不會跳過后續(xù)的關(guān)閉操作。
特別注意自從Java1.7開始支持了try-with-resources寫法即將資源對象聲明的過程放在try()的括號里面這樣java在資源對象使用完成之后會自動關(guān)閉。
try (
FileOutputStream fileOutputStream = new FileOutputStream("E:\A.txt");
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
DataOutputStream out = new DataOutputStream(bufferedOutputStream)
)
{
out.write(data1);
} catch (Exception e) {
// TODO: handle exception
}
另外還有一些第三方庫提供了一些統(tǒng)一的關(guān)閉處理方法例如
import org.apache.commons.io.IOUtils;
public static void main(String[] args) throws Exception{
FileOutputStream fileOutputStream = null;
BufferedOutputStream bufferedOutputStream=null;
DataOutputStream out=null;
byte[] data1 = "這個(gè)例子測試文件寫".getBytes("GB2312");
try {
fileOutputStream = new FileOutputStream("E:\A.txt");
bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
out = new DataOutputStream(bufferedOutputStream);
out.write(data1);
} catch (Exception e) {
// TODO: handle exception
} finally {
IOUtils.closeQuietly(out);
}
}
這個(gè)apache提供的IOUtils類庫可以通過IOUtils.closeQuietly(e)的形式關(guān)閉資源對象實(shí)際內(nèi)部實(shí)現(xiàn)依然是調(diào)用.close()方法。內(nèi)部實(shí)現(xiàn)代碼如下:
public static void closeQuietly(final Closeable closeable) {
try {
if (closeable != null) {
closeable.close();
}
} catch (final IOException ioe) {
// ignore
}
}
以上就是手動關(guān)閉Java資源對象的幾種安防寫法希望對你有所幫助。
為什么會出現(xiàn)未將對象引用設(shè)置到對象的實(shí)例?
一般出現(xiàn)在安裝好Max之后、14版本好像出現(xiàn)的比較頻繁、具體情況如下:具體解決辦法如下:首先把《顯示安防文件打開》、再然后看著下邊截圖的路徑在C盤找、然后刪了3DSmax這個(gè)文件夾。
裝pageAdmin時(shí)出現(xiàn)錯(cuò)誤?
異常詳細(xì)信息:System.NullReferenceException:未將對象引用設(shè)置到對象的實(shí)例。缺少引用看看是那個(gè)頁面出錯(cuò)可能是少什么DLL的文件
的區(qū)別在哪?
C語言C++C#都是非常重要的語言并且C++是C的擴(kuò)充C#借鑒了C++的語法它們有著相似的語言結(jié)構(gòu)卻有著不同的語言特性。在編程語言排行榜上它們也總是名列前茅。
編程語言的基本概念很重要。無論學(xué)C還是學(xué)C++基本概念都是安防位的也是比較困難的但只有把握了基本概念才能把握整體脈絡(luò)才能居高臨下。
C語言
c語言程序設(shè)計(jì)是過程性的程序設(shè)計(jì)語言它的發(fā)展貫穿了計(jì)算機(jī)發(fā)展的歷程它蘊(yùn)含了程序設(shè)計(jì)的基本思想囊括了程序設(shè)計(jì)的基本概念所以它是理工科高等院校的一門基礎(chǔ)課程。
目前安防安防、安防有影響、應(yīng)用安防廣泛的windows、linux和UNIX三個(gè)操作系統(tǒng)都是用C語言編寫的。由此可以肯定地說c語言是一門十分安防而又重要的語言。
C++
C++是C語言的繼承它既可以進(jìn)行C語言的過程化程序設(shè)計(jì)又可以進(jìn)行以抽象數(shù)據(jù)類型為特點(diǎn)的基于對象的程序設(shè)計(jì)還可以進(jìn)行以繼承和多態(tài)為特點(diǎn)的面向?qū)ο蟮某绦蛟O(shè)計(jì)。C++是C語言的擴(kuò)充應(yīng)用非常廣泛。常用于系統(tǒng)開發(fā)引擎開發(fā)等應(yīng)用領(lǐng)域支持類、封裝、繼承、多態(tài)等特性這使它在短短幾年內(nèi)迅速流行起來C++在軟件開發(fā)領(lǐng)域有著杰出的貢獻(xiàn)
C#
C#是微軟公司發(fā)布的一種由C和C++衍生出來的面向?qū)ο蟮木幊陶Z言、運(yùn)行于.NET Framework和.NET Core(完全開源跨平臺)之上的高級程序設(shè)計(jì)語言。C#借鑒了C++的語法與Java的語言特性相似但是C#與Java有著明顯的不同它借鑒了Delphi的一個(gè)特點(diǎn)與COM(組件對象模型)是直接集成的而且它是微軟公司 .NET windows網(wǎng)絡(luò)框架的主角。
C#與C++ 比較的話安防重要的特性就是 C# 是一種完全面向?qū)ο蟮恼Z言而 C++ 不是另外 C# 是基于 IL 中間語言和 .NET Framework CLR 的在可移植性可維護(hù)性和強(qiáng)壯性都比 C++ 有很大的改進(jìn)
C#的設(shè)計(jì)目標(biāo)是用來開發(fā)快速穩(wěn)定可擴(kuò)展的應(yīng)用程序當(dāng)然也可以通過Interop 和 Pinvoke 完成一些底層操作但是對于一些和底層系統(tǒng)相關(guān)很緊密的程序(譬如說驅(qū)動程序)還是建議用 C++ 來寫
C++ 不允許在一個(gè)構(gòu)造函數(shù)中調(diào)用另外一個(gè)構(gòu)造函數(shù)(稱為委派構(gòu)造函數(shù)調(diào)用)而 C# 則允許。委派構(gòu)造函數(shù)調(diào)用語法上非常自然和易懂事實(shí)上 C++ 不提供這一特性并不是出于語法上的考慮而是出于資源管理的考慮(這樣的事情對 C++ 來說還有很多很多)。
C# 無疑是非常好的編程語言它幾乎集中了所有關(guān)于軟件開發(fā)和軟件工程研究的安防成果。面向?qū)ο?、類型安全、組件技術(shù)、自動內(nèi)存管理、跨平臺異常處理、版本控制、代碼安全管理。
計(jì)算機(jī)軟件開發(fā)發(fā)展到現(xiàn)在其實(shí)已經(jīng)是很細(xì)分的市場有專門的應(yīng)用軟件市場也有系統(tǒng)軟件市場C/C++和Java等各自應(yīng)對的是不同的市場因此二者其實(shí)沒有可比性的。
建議已經(jīng)選擇Java、.net等其他語言方向的同學(xué)不要跟風(fēng)在自己的領(lǐng)域深入進(jìn)去你們也能成為牛人的。
如有不同觀點(diǎn)歡迎發(fā)表評論。如果喜歡我的回答歡迎“點(diǎn)贊、分享”。
返回:安防新聞
廣告咨詢:18215288822 采購熱線:18215288822
聲明:農(nóng)機(jī)大全所有(圖文、音視頻)均由用戶自行上傳分享,僅供網(wǎng)友學(xué)習(xí)交流,版權(quán)歸原作者。若您的權(quán)利被侵害,請聯(lián)系 56325386@qq.com 刪除。
載注明出處:http://www.digitalhomeuk.com/news/287281.html