io流編譯期和運行期異常
❶ 用好這個IDEA插件,寫代碼效率至少提升5倍!
還在編寫無聊枯燥又難以維護的POJO嗎?潔癖者的春天在哪裡?請看Lombok!
在過往的java項目中,充斥著太多不友好的代碼:POJO的getter/setter/toString;異常處理;I/O流的關閉操作等等,這些樣板代碼既沒有技術含量,又影響著代碼的美觀,Lombok應運而生。
首先說明一下:任何技術的出現都是為了解決某一類問題的,如果在此基礎上再建立奇技淫巧,不如回歸Java本身。應該保持合理使用而不濫用。
Lombok的使用非常簡單,下面我們一起來看下:
1)引入相應的maven包:
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.18</version><scope>provided</scope></dependency>Lombok的scope=provided,說明它只在編譯階段生效,不需要打入包中。事實正是如此,Lombok在編譯期將帶Lombok註解的Java文件正確編譯為完整的Class文件。
2)添加IDE工具對Lombok的支持:
IDEA中引入Lombok支持如下:
點擊File--Settings設置界面,安裝Lombok插件:
點擊File--Settings設置界面,開啟AnnocationProcessors:
開啟該項是為了讓Lombok註解在編譯階段起到作用。
Eclipse的Lombok插件安裝可以自行網路,也比較簡單,值得一提的是,由於Eclipse內置的編譯器不是Oraclejavac,而是eclipse自己實現的EclipseCompilerforJava(ECJ).要讓ECJ支持Lombok,需要在eclipse.ini配置文件中添加如下兩項內容:
-Xbootclasspath/a:[lombok.jar所在路徑]
-javaagent:[lombok.jar所在路徑]
3)Lombok實現原理:
自從Java6起,javac就支持「」規范,只要程序實現了該API,就能在javac運行的時候得到調用。
Lombok就是一個實現了"JSR269API"的程序。在使用javac的過程中,它產生作用的具體流程如下:
javac對源代碼進行分析,生成一棵抽象語法樹(AST)
javac編譯過程中調用實現了JSR269的Lombok程序
此時Lombok就對第一步驟得到的AST進行處理,找到Lombok註解所在類對應的語法樹(AST),然後修改該語法樹(AST),增加Lombok註解定義的相應樹節點
javac使用修改後的抽象語法樹(AST)生成位元組碼文件
4)Lombok註解的使用:
POJO類常用註解:
@Getter/@Setter:作用類上,生成所有成員變數的getter/setter方法;作用於成員變數上,生成該成員變數的getter/setter方法。可以設定訪問許可權及是否懶載入等。
packagecom.trace;importlombok.AccessLevel;importlombok.Getter;importlombok.Setter;/***CreatedbyTraceon2018/5/19.<br/>*DESC:測試類*/@SuppressWarnings("unused")publicclassTestClass{publicstaticvoidmain(String[]args){}@Getter(value=AccessLevel.PUBLIC)@Setter(value=AccessLevel.PUBLIC)publicstaticclassPerson{privateStringname;privateintage;privatebooleanfriendly;}publicstaticclassAnimal{privateStringname;privateintage;@Getter@Setterprivatebooleanfunny;}}在Structure視圖中,可以看到已經生成了getter/setter等方法:
編譯後的代碼如下:[這也是傳統Java編程需要編寫的樣板代碼]
////Sourcecoderecreatedfroma.classfilebyIntelliJIDEA//(poweredbyFernflowerdecompiler)//packagecom.trace;publicclassTestClass{publicTestClass(){}publicstaticvoidmain(String[]args){}publicstaticclassAnimal{privateStringname;privateintage;privatebooleanfunny;publicAnimal(){}publicbooleanisFunny(){returnthis.funny;}publicvoidsetFunny(booleanfunny){this.funny=funny;}}publicstaticclassPerson{privateStringname;privateintage;privatebooleanfriendly;publicPerson(){}publicStringgetName(){returnthis.name;}publicintgetAge(){returnthis.age;}publicbooleanisFriendly(){returnthis.friendly;}publicvoidsetName(Stringname){this.name=name;}publicvoidsetAge(intage){this.age=age;}publicvoidsetFriendly(booleanfriendly){this.friendly=friendly;}}}@ToString:作用於類,覆蓋默認的toString()方法,可以通過of屬性限定顯示某些欄位,通過exclude屬性排除某些欄位。
@EqualsAndHashCode:作用於類,覆蓋默認的equals和hashCode
@NonNull:主要作用於成員變數和參數中,標識不能為空,否則拋出空指針異常。
@NoArgsConstructor,@RequiredArgsConstructor,@AllArgsConstructor:作用於類上,用於生成構造函數。有staticName、access等屬性。
staticName屬性一旦設定,將採用靜態方法的方式生成實例,access屬性可以限定訪問許可權。
@NoArgsConstructor:生成無參構造器;
@RequiredArgsConstructor:生成包含final和@NonNull註解的成員變數的構造器;
@AllArgsConstructor:生成全參構造器。
編譯後結果:
publicstaticclassPerson{@NonNullprivateStringname;privateintage;privatebooleanfriendly;publicStringtoString(){return"TestClass.Person(name="+this.getName()+",age="+this.getAge()+")";}@NonNullpublicStringgetName(){returnthis.name;}publicintgetAge(){returnthis.age;}publicbooleanisFriendly(){returnthis.friendly;}publicvoidsetName(@NonNullStringname){if(name==null){thrownewNullPointerException("name");}else{this.name=name;}}publicvoidsetAge(intage){this.age=age;}publicvoidsetFriendly(booleanfriendly){this.friendly=friendly;}privatePerson(){}privatestaticTestClass.Personof(){returnnewTestClass.Person();}@ConstructorProperties({"name"})Person(@NonNullStringname){if(name==null){thrownewNullPointerException("name");}else{this.name=name;}}@ConstructorProperties({"name","age","friendly"})publicPerson(@NonNullStringname,intage,booleanfriendly){if(name==null){thrownewNullPointerException("name");}else{this.name=name;this.age=age;this.friendly=friendly;}}}@Data:作用於類上,是以下註解的集合:@ToString@EqualsAndHashCode@Getter@Setter@RequiredArgsConstructor
@Builder:作用於類上,將類轉變為建造者模式
@Log:作用於類上,生成日誌變數。針對不同的日誌實現產品,有不同的註解:
其他重要註解:
@Cleanup:自動關閉資源,針對實現了java.io.Closeable介面的對象有效,如:典型的IO流對象
編譯後結果如下:
是不是簡潔了太多。
@SneakyThrows:可以對受檢異常進行捕捉並拋出,可以改寫上述的main方法如下:
@Synchronized:作用於方法級別,可以替換synchronize關鍵字或lock鎖,用處不大。
作者:LiWenD正在掘金
❷ 安卓開發入門教程學習Android語言Java
開發環境基礎語法,熟悉程序結構,深入細致的介紹Java中面向對象的編程思想,結合常用設計模式、演算法,IO流、多線程、集合框架、網路編程、反射內省、泛型、註解、XML、MySQL、Servlet等核心知識,全面掌握Java語言的精髓所在,為Android開發打下扎實的基礎
❸ 學習編程都學些什麼內容
編程先學邏輯,就是先執行什麼後執行什麼,能得出什麼樣的結果。接下來是學語法,比如for,if,while這些,都是根據不同語種學習不同的內容;到了高階就開始學習演算法,因為演算法可以協助做自己的框架,引擎等。用簡單的話來說,編程就是學習。一門計算機語言好比大家學習英文是為了跟外國人打交道,學習編程,就是跟計算機打交道。編程學習的內容有:C語言、Python、C++、Java Script、Java、Swift、R等。1、C 語言:C 語言作為一種簡單靈活的高級編程語言,它是一個面向過程的語言,一般是作為計算機專業的基礎入門語言課程。
簡單的說,編程就是為了藉助於計算機來達到某一目的或解決某個問題,而使用某種程序設計語言編寫程序代碼,並最終得到結果的過程。 計算機雖然功能十分強大。可以供大家上網、打游戲、管理公司人事關系等等,但是沒有程序,它就等於是一堆廢鐵,不會理會大家對它下達的「命令」。於是,想要馴服它,只有通過一種方式——程序,這也是人們和計算機溝通的唯一方式。
拓展資料:編程的執行原理:
1、計算機對除機器語言以外的源程序不能直接識別、理解和執行,都必須通過某種方式轉換為計算機能夠直接執行的。
2、這種將高級程序設計語言編寫的源程序轉換到機器目標程序的方式有兩種:解釋方式和編譯方式。
3、解釋方式下,計算機對高級語言書寫的源程序一邊解釋一邊執行,不能形成目標文件和執行文件。
4、編譯方式下,首先通過一個對應於所用程序設計語言的編譯程序對源程序進行處理,經過對源程序的詞法分析、語法分析、語意分析、代碼生成和代碼優化等階段將所處理的源程序轉換為用二進制代碼表示的目標程序。
然後通過連接程序處理將程序中所用的函數調用、系統功能調用等嵌入到目標程序中,構成一個可以連續執行的二進制執行文件。調用這個執行文件就可以實現程序員在對應源程序文件中所指定的相應功能。
想要學習視頻剪輯可以去專業機構學習,達內教育就是不錯的選擇。達內教育科技集團人類課程方向:Java企業級應用軟體工程師、Java互聯網架構軟體工程師、Java大數據工程師、Web前端開發工程師、網路運維與網路安全、新電商運營官、企業級影視視效、人力資源經理人課程、總賬會計課程等,有線上兔費的Java線上公開課,幾千名學員同時在校學習,有零基礎小白,有在校大學生,也有剛畢業懂理論知識但上手比較困難 ,還有需要企業項目實戰經驗擴充能力等等。
參考資料:計算機編程https://ke.sogou.com/v107828.htm?fromTitle
❹ 如何系統的學習JAVA
玩Java多年的老司機帶你上車全面系統學習Java,並且還能教你如何學習才能在今年拿到一份不錯的offer。
說到系統全面,就是以目前絕大部分公司招聘要求的知識內容為基準,畢竟我們學習Java都是為了高薪工作,《史記》中說」天下熙熙皆為利來,天下攘攘皆為利往「,為了高薪工作而學習Java技術,這都是人之常情,也是大部分人奮斗的目標。
我們先看看市場上招聘Java程序員都需要哪些技術:
二、資料庫篇
資料庫是學習Java語言必學的一項內容,常見的資料庫就是MySQL和Oracle這兩種,作為初學者一般都是學習MySQL為主,一般情況下中小型企業都會選擇MySQL資料庫,比較大型的互聯網公司會選擇用Oracle,而學習Oracle相對於MySQL也要復雜一些,建議是主要學習MySQL資料庫,Oracle作為了解即可。學習資料庫較為簡單,基本的操作就是增刪改查。
三、Web開發
Web前端內容:HTML/CSS/JavaScript/(前端頁面)
注意:Java後端開發可以不用過多關注HTML頁面及CSS的處理,但是最起碼要會用簡單的HTML,JavaScript是必須要會的,因為Javaweb後端程序員畢竟要接觸使用AJAX方式處理數據及顯示。當然如果只關注伺服器端實現而不考慮任何用戶界面,則HTML、CSS、JavaScript都不用關注,但是完全脫離前端的開發現在雖然也不少,但是絕對不關心前端是不可能,尤其是JavaScript,但是前端卻可以完全不關心伺服器後台的任何實現。
推薦學習書籍:《JavaScriptDOM編程藝術》(第二版)
這本書作為被大家推薦的最多的前端入門書籍是有道理的。他能真正讓大家了解dom腳本編程,或是說前端編程技術背後的思路和原則。對於初學者來說,這本書沒有任何門檻,按部就班跟著書籍實例編寫代碼即可。我們會知曉如何對瀏覽器元素操作和掌控,會學會如何實現簡單的頁面效果。這種簡單易得的成就感是一個編程語言入門時最難能可貴的體驗。
JavaEE內容:Servlet/JSP
雖然現在網上在傳JSP很少用了,可能是被一些模板或JSAJAX方式代替了一些,但是我認為還是應該接觸一下,萬一要用到不會怎麼辦,而且它是JavaEE的動態網頁實現標准組件。學習JSP過程也能更好的幫助我們理解web會話的過程,掌握web會話都有哪些我們必需知道的。如果學習Javaweb、JSP都不接觸那就相當於學習使用Springboot而一點不接觸SpringFramework一樣,豈不是稀里糊塗。包括開發Javaweb我們必需知道的概念諸如Web應用上下文,請求對象,響應對象,HttpSession,Cookie等都是在接觸學習JSP和Servelt中體現的,還有一些比較少見的EJBJSFJMS以及JavaFelix等。
一些初學者不清楚這些難免會有誤區,尤其是有些較成熟的工程師也這么說,我只能說他們很無知,只是代碼機器而已,其實對於應用開發設計也就稀里糊塗,人雲亦雲罷了。
永遠沒有被淘汰的技術也沒有永遠流行萬能的技術,要看在什麼環境和場合應用,符合我需求的技術和工具就是好的,就是對的。
四、高級框架
1、Springframework核心IOC容器
2、Springboot在Spring基礎上的更全面提升效率的Spring工具
3、ORM框架當今流行使用較多的是Mybatis和MP(Mybatis插件),Hibernate是可選性學習的
4、模板技術,比較成熟的Freemarker
5、SpringCloud微服務框架,SpringCloud提供的全套的分布式系統解決方案。
五、工具
maven是構建管理項目的工具,svn和git是團隊協作開發的項目源代碼及相關文檔資料管理工具,需要學習者初步掌握其應用。
像Tomcat,jetty,resin,JBoss,GlassFish等都是部署運行Javaweb應用的伺服器。
以上就是初學者大概學習的內容,我是盡量站在初學者的角度來說的,沒有寫得特別復雜,怕初學者看不懂,沒有實質性的幫助。所以我盡量用白話把話說的簡單一些,給大家羅列出主要學習的Java知識點。
知道了Java要學習的大概內容,下面就是怎麼才能用最好的方式把Java學好,從而達到就業的水平,首選我們應該了解一下目前想要達到找到工作的水平,應該是怎樣的。如果大家對於學習Java有任何的問題,關於如何提升學習Java以及學習方法、學習技巧、快速達到就業的技術水平,都可以隨時來問我,這是我建立了5年的Java學習交流裙,前面三個是494,中間三個是801,後面三個是931。 有不懂的問題可以隨時在裡面問,需要Java各個階段的學習資料也可以在裡面進行下載。
Java學到什麼程度才能達到就業的水平:對於大多數初學Java的同學而言,最關心的莫過於我學要學習哪些和學到什麼程度才能找到相關的Java研發工作崗位。
不同的軟體公司對研發人員的水平要求存在一定的差異,如果從大多數中小型企業來看能接受一個入職到本企業的IT技術人員通常需要具備以下能力。
1理解掌握Java核心面向對象的設計思想和代碼構建,能以面向對象方式設計編寫業務功能;
2熟練掌握至少兩種資料庫的開發,如Oracle,mySql,能熟練編寫基本常用及高級的SQL語句;
3必需掌握並熟練應用SpringframeworkIOC容器,深入了解IOC及AOP概念並應用,使用MVC實現對web請求做出處理;
4熟練掌握Java處理資料庫的ORM框架myBatis,JDBCTemplate,對Hibernate也應有所了解;
5熟練應用Spring增強工具集合Springboot;
6至少熟練使用Eclipse及IDEA集成開發工具構建應用程序;
7能夠基本掌握MVNGITMaven在項目中的使用;
8前端開發必需掌握JavaScript和常用的JS框架
以上這些都是中小型軟體企業的入職基本要求,如果你能夠達到這個水平,找到一份Java工作應該是不難的。
推薦的學習方式:系統視頻教程+書籍輔助+有人指導
視頻教程:對於Java初學者來說,看視頻學習也是最普通的方式,視頻教程會把工作中常用的知識進行講解,而且視頻一般都是分章分節,每一個小節都只講一個知識點,學習起來較為明確。但是視頻教程盡量要完整,最好是一整套視頻學習。
書籍輔助:書籍便於對理論知識的補充,以便更容易理解Java面向對象核心設計理念和代碼實踐功能。
PS:但是大部分人都沒有耐心看不下去書,所以大部分人都是只看視頻教程學習。如果自己能看的下去就看,看不下去就不看。
有人指導:大部分人都不可能全靠自己的能力把Java學的特別好,因為你不了解這個行業,也不知道怎麼學,完全零基礎自學Java想要找到工作,概率極低。所以建議如果真的想要做這行,盡量找人去帶帶你,有不懂的問題可以直接請教,少走彎路,提高效率。學習的質量決定以後工作的薪資以及起點,所以還是應該重視起來。
項目的重要性
很多Java初學者看完一些視頻,學過一段時間就說自己「會了」。這里我需要給大家糾正一個問題,希望每個學習Java的知友都能明確學習編程的中心是什麼。其實在我看來,學習編程從來都不存在會不會這樣的說法。學習編程不同於初中學的數學、物理、化學,記住一些公式,做同樣一種類型的習題,就證明類似的題型你會做了。編程只講技術能力是什麼水平、什麼級別的,最能證明技術水平處在什麼階段的,就是在做項目的過程中,研發好的互聯網產品,寫代碼的質量怎麼樣,排錯能力怎麼樣,找BUG的能力怎麼樣,構思功能模塊整體布局的能力怎麼樣等等。做作為初學者想要達到入門的水平,就是自己具備了一些簡單項目的編碼能力,初學者最重要的一點就是培養自己的編程思維,每一個程序都是不一樣的,你不可能都背下來,學編程也不是靠死記硬背的,你只有能去獨立編碼寫一些東西的時候,才有就業的機會。
所以做項目的能力才能去衡量一個學習的水平處在什麼階段,而往往那些嘴上說「會了」的人,往往沒寫過多少代碼,也一個項目做不了出來,這就是紙上談兵,完全曲解了學習編程到底在學什麼,也不知道應該往哪裡去。
所以一個Java初學者在學習的整體過程中,必須要有兩個能拿得出手,能寫在簡歷上的項目作為找工作的資本,並且要對於這兩個項目的前前後後相當了解,才可能最後面試成功,一個初學者在學習完Java所有內容後,如若還達不到可以做簡單項目的水平,那麼他整個學習過程還是白費,沒有達到最終的學習目的,就是學習質量不過關。所以項目的重要性希望大家都明確,因為有太多Java初學者不知道最後學習的目的是什麼,最後白白的浪費時間。
學習心態:
學習編程一定不是一個簡單的事情,換句話說它還是挺困難的,畢竟能出去找到工作,就是少則五六千,多則上萬的工種。這些知識都不是隨隨便便就是任何一個人都能學會的。關於這個學習心態,希望提示大家要把重心放到「學習」這件事上,因為我發現有很多Java初學者都是像「完成任務」一樣去學習,所謂完成任務就是「我把這些視頻看完就能找到工作嗎」「我把這些都學完就能找到工作嗎」學完並不等於「學會」,這是兩種不同的概念。
你到底理沒理解?
你到底能不能應用起來?
你到底用沒用心?
你自己應該是最清楚的,我發現那些把學習當做完成任務一樣去對待的,這樣的人沒有一個是有耐心的,自己在心裡欺騙自己「把這些視頻看完我就能找到工作」,到了最後自己就逐漸明白,完全是自欺欺人,最後放棄說自己不適合學這個。其實揭開這些人的面具真相就一個:他們沒有耐心學習,也不喜歡學習,這是以前經歷造成的,是多年的習慣導致的。
所以正確的學習心態一定是把關注點放到學習這件事本身,你要學會這些知識,這些內容,這些技術,這是需要一天一天逐漸積累起來的,並不是短時間就可以達到什麼結果。
PS:如果你對於學習沒什麼耐心,沒什麼興趣,我勸你不要來學習編程,學習編程絕對是一個耐心的活,也是需要不斷學習和充電的行業。或者說已經到了信息時代,不愛學習的人,很難有耐心去學習知識的人,在信息時代是混不下去的,任何行業都是如此,不學習不進步不緊貼時代的人就一定會被淘汰。
最終自學Java能就業的人基本具備以下幾點:
1、有超強的學習耐心及進取心
2、手不懶,代碼寫的足夠多,熟能生巧
3、有一定的學習能力,善於自學善於自己解決問題
4、可以獨立寫一些簡單的項目
以上內容均由本人手寫而成,完全站在Java初學者的角度來說,就是希望能用通俗易懂的語言讓大家清晰的明白學習Java全面系統的學習內容,以及應該達到什麼程度才能拿到一份Java工作的offer,希望可以給大家帶來幫助。
❺ 關閉io流 為什麼要判斷
如果fw不是對象或對象為空的時候fw.close(),程序會拋出NollPointerException異常。
你可以不關閉,但是它會一直佔用你的系統資源,
fw != null是檢測fw是不是個對象。
哈哈,有意思,判斷一下就是為了不讓程序出錯,是你的程序更健康。
再說了,你覺得你寫的程序讓別人一點,或者一運行就報錯很有面子嗎?
舉個不恰當的例子啊:
如果一個人大便完,就要擦乾凈在出來,那個判斷只是判斷一下有沒有上廁所,如果上了就要擦乾凈,即使這個人一輩子只去一次也不行,當然也可以不擦就出來,如果你不怕別人罵你沒素質的話,呵呵。
初始化之後就不是指向為空的對象了,fileWriter fw = null;是在內存中存一個值,但是這個值為空,初始化就是為這個為空的值賦值,在沒有初始化的時候調用這個對象的屬性和方法都會報空指針異常。
個人是這么理解的,供你參考。