Intellj IDEA 簡易教程


Intellj IDEA 簡易教程

目錄

Java開發IDE(Integrated Development Environment,集成開發環境),大多圖書上使用的是EclipsesNetBeans,考慮到我們課程會涉及到Android開發,而用於Android開發的IDE Android Studio(CN)是在Intellij IDEA上構建的,所以我們上課推薦的IDE是Intellij IDEA

Intellij IDEA是收費軟件,但對學生和老師免費,可以到這里申請免費使用

IDEA的使用過程中要慢慢掌握常用的快捷鍵(哪個常用就刻意記憶一下,參考十大Intellij IDEA快捷鍵).IDEA的快捷鍵如下圖所示:

返回目錄

JDK 安裝測試

Linux下安裝JDK

  1. 參考「程序開發與信息安全工具箱」,下載並安裝JDK
  2. Linux 版JDK下載后

使用tar -xzvf jdk-8u121-linux-x64.tar.gz; mv jdk-8u121 ~/jdk 進行解壓(注意時間不同,xuxxx會不同),然后通過vi .bashrc 添加下面幾行設置環境變量:

export JAVA_HOME=~/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  1. 參考「程序開發與信息安全工具箱」,下載並安裝Atom.

  2. 參考別出心裁的Linux命令學習法,使用mkdir -p Code/20155200 (改成自己的學號)建立學習目錄。

Windows下安裝JDK

  1. 參考「程序開發與信息安全工具箱」,下載並安裝JDK;詳細過程參考JDK8圖解安裝

注意:安裝JDK選擇安裝目錄,安裝過程中會出現兩次安裝提示:第一次是安裝JDK,第二次是安裝Public JRE。建議JDK安裝在自己選擇的目錄中,Public JRE安裝在默認目錄中。(不能都安裝在Java文件夾的根目錄下,JDK和Public JRE安裝在同一文件夾會出錯)

  1. 沒有DOS命令基礎的同學先學習「Java程序設計的DOS命令基礎」,參考相關內容

  2. 參考「程序開發與信息安全工具箱」,下載並安裝Atom.

  3. 參考「程序開發與信息安全工具箱」,下載並安裝PowerCMD。參考Java程序設計的DOS命令基礎學習DOS命令的使用。

  4. 打開PowerCMD,使用mkdir Code\20155200(改成自己的學號)建立工作目錄。

macOS下安裝JDK

參考「程序開發與信息安全工具箱」,下載並安裝JDK

測試JDK

  1. 進入命令行界面(shell或PowerCMD)
  2. 輸入atom Hello.java注意把代碼保存到exp1目錄中)或vim Hello.java(建議大家花點時間學習一下Vim)編輯Hello.java,並輸入以下代碼:
1 package ljp;
2 import java.util.Scanner;
3 public class Hello{
4 	public static void main(String[] args){
5       System.out.println("Input your first name, please:");
6       Scanner s = new Scanner(System.in);
7       String name = s.next();
8       System.out.println("Hello " + name + " !");
9    }
10 }

注意代碼的第一行,這會影響到我們使用javac編譯代碼的方式。
注意代碼第二行,我們使用到Java類庫中的類時,要用import導入相關的類(你可以暫時理解為C語言中include的功能),導入路徑可以查看JDK幫助文檔,比如我們使用到了Scanner類,路徑見下圖中紅框:
圖片描述信息
3. 輸入javac -d . Hello.java命令編譯代碼,輸入java ljp.Hello命令運行
程序。結果如下圖所示:
編譯運行
注意:代碼中有package時,使用javac編譯代碼時一定要加-d參數,運行代碼時一定要加包名前綴

返回目錄

IDEA 安裝測試

IDEA的安裝在Linux,Windows,macOS下安裝都差不多,我們以Windows下的安裝為例說明。

  1. 通過Toolbox App下載網站 下載相應平台的Toolbox App並安裝:
  2. 運行Toolbox App並安裝Intellj IDEA Ultimate:
  3. 第一次運行IDEA,會讓你選擇是否導入以前的設置,我們選擇不導入
  4. 插件安裝我們選擇默認安裝:
  5. IDEA中通過項目(Project)管理代碼,我們通過「Create New Project」新建一個項目:
  6. 第一次新建項目要配置JDK,選擇左邊列表中的「Java」,點擊右方的New按鈕:
  7. 選擇配置JDK:
  8. 選中你系統中JDK的安裝目錄:
  9. JDK配置成功:
  10. 點擊「Next」按鈕:
  11. 輸入項目名稱「HelloWorld」,點擊「Finish」按鈕,項目就建好了:
  12. 幾個常用快捷鍵,通過應用熟練掌握了:
  13. 按「Alt+1」顯示項目視圖:
  14. 用鼠標在「src」上點擊右鍵,選擇「New」->「Java Class」新建Java類:
  15. 輸入類名「HelloWorld」:
  16. 在代碼編輯窗口中輸入「psvm」,然后按「tab」,IDEA會幫我們生成main方法:

  17. 在代碼編輯窗口中輸入「sout」,然后按「tab」,IDEA會幫我們生成System.out.println(),這是使用IDE的便利之處:

  18. 修改代碼,讓程序輸出「Hello World!」:
  19. 通過「Run」->「Run...」來編譯,運行程序,建議大家觸通過實踐掌握快捷鍵「Alt+Shift+F10」:
  20. 選中要運行的類「Hello World」:
  21. 運行結果如下:

返回目錄

調試

程序設計中有三類錯誤:

  • 編譯時錯誤:語法錯誤,初學者易犯
  • 運行時錯誤:異常處理
  • 邏輯錯誤:能編譯運行,但運行結果不對

邏輯錯誤是大家學習中遇到最多的錯誤,要學會通過調試(Debug)來定位邏輯錯誤,常用技能有:

  • 自頂向下進行調試
  • 學會設置斷點(行斷點/函數斷點/條件斷點/臨時斷點)
  • 學會單步運行
  • 循環的調試
  • 函數(方法)的調試
  • 二分法定位錯誤
  • ...

在命令行中調試Java程序參考Java中使用JDB,我們在這學習在IDEA中調試程序。

  1. 在上面的HelloWorld項目中,新建「HelloJDB」類,輸入如下代碼:
1 public class HelloJDB {
2	public static void main(String[] args) {
3		int i = 5;
4		int j = 6;
5		int sum = add(i, j);
6		System.out.println(sum);
7			
8		sum = 0;
9       for(i=0; i< 100; i++)
10			sum += i;
11			
12		System.out.println(sum);
13	}
14		
15	public static int add(int augend, int addend){
16		int sum = augend + addend;
17		return sum;
18	}
19}
  1. 調試程序首先要會設置斷點單步運行。設置斷點比較簡單,在要設置斷點的行號旁用鼠標單擊一下就行了(或使用Ctrl+F8快捷鍵),如下圖所示,我們在第5行設了個斷點:
  2. 然后單擊菜單「Run」->「Debug...」(或使用Alt+Shift+F9快捷鍵)開始調試Java程序,我們可以看到程序停留在了第5行,如下圖所示:

    注意,此時第5行代碼並沒有執行,我們看到變量sum的值並不是11,我們通過單步運行讓程序運行到第6行,單步運行有兩種:Step Into(快捷捷F7)Step Over(快捷捷F8),這兩種單步運行功能在運行語句時沒有區別,在執行方法調用語句時,Step Into會跳入方法實現,Step Over會直接執行完方法,實際使用中我們優先使用Step Over,只有方法執行出錯了,說明程序問題在被調用方法中,這時再回來通過Step Into進入方法進行調試。我們單擊一下Step Over圖標(或F8),程序停在了第5行,這時查看變量i的值,會看到sum等於11。如下圖所示:
  3. 單步執行效率比較慢,如果我們感覺到第5行到第8行的代碼沒有問題了,想讓程序直接運行到第9行,怎么辦?首先我們要在第9行設置斷點,然后單擊Resume圖標(快捷鍵F9),程序就運行到了第11行,如下圖所示:
  4. 單步執行效率比較慢還導致另外一個問題,比如一個大循環中間出了問題怎么辦?這時可以通過條件斷點解決問題。設置條件斷點,我們在第9行左邊斷點處單擊鼠標右鍵,彈出斷點屬性框,我們設置條件“i==50”,如下圖所示:

    按一下F9,我們可以查看i的是50了。如下圖所示:
  5. 臨時斷點,斷點只中斷一次,比如我們想把第9,10行的for循環一下子運行完,我們就需要在第12行設個條件斷點。我們可以在第十二行設個斷點,然后鼠標右擊斷點:

    然后點「More」或按快捷鍵Ctrl+Shift+F8打開斷點設置窗口,選中「Remove Once hit」

    也可以把光標移到第12行,兩次按快捷鍵Ctrl+Shift+F8打開斷點設置窗口,選中「Remove Once hit」;最簡單的方法是把光標移到第12行,使用菜單「Run」->「Toggle Temporary Line Breakpoint」或使用快捷鍵Ctrl+Alt+Shift+F8;斷點上面有個1,運行一次就消失了:

    解決問題的方法也可以不使用臨時斷點,把光標移到第12行,使用菜單「Run」->「Run to Cursor」或使用快捷鍵Alt+F9,如下圖.
  6. 方法斷點:有時候我們懷疑某個方法出錯了,就可以設置方法斷點。把光標移到方法中的任一行,使用菜單「Run」->「Toggle Method Breakpoint」.

掌握這些調試的基本技巧可以解決大家平時遇到的大部分問題,其他調試方法可以參見參考資料。

返回目錄

單元測試

Java編程的學習 《積極主動敲代碼,使用JUnit學習Java》給出了學習方法。其中提到的JUnit就是Java單元測試工具。

現代軟件工程講義 2 開發技術 - 單元測試 & 回歸測試中說:

你的RP是由你的程序質量決定的。
這一章講的是兩人合作,既然程序是兩個人寫的,那就會出現一個人寫的模塊被另一個人寫的模塊調用的情況。很多誤解、疏忽都發生在兩個模塊之間。如何能讓自己寫的模塊盡量無懈可擊?單元測試就是一個很有效的解決方案。

什么是單元測試?單元測試(unit testing),是指對軟件中的最小可測試單元進行檢查和驗證。對於單元測試中單元的含義,一般來說,要根據實際情況去判定其具體含義,如Java里單元指一個類。

編程是智力活動,不是打字,編程前要把干什么、如何干想清楚才能把程序寫對、寫好。與目前不少同學一說編程就打開編輯器寫代碼不同,我希望同學們養成一個習慣,當你們想用程序解決問題時,要會寫三種碼:

  • 偽代碼
  • 產品代碼
  • 測試代碼

我們通過一個例子說明如何寫這三種代碼。

需求:我們要在一個MyUtil類中解決一個百分制成績轉成“優、良、中、及格、不及格”五級制成績的功能。

我們先寫偽代碼,偽代碼可以用漢語寫,推薦大家用英語寫,偽代碼與具體編程語言無關,不要寫與具體編程語言語法相關的語句(如用malloc分配內存,這樣只能用C語言編程了),偽代碼從意圖層面來解決問題,最終,偽代碼產品代碼最自然的、最好的注釋。針對上面的問題,我們可以通過偽代碼這樣解決:

百分制轉五分制:
如果成績小於60,轉成“不及格”
如果成績在60與70之間,轉成“及格”
如果成績在70與80之間,轉成“中等”
如果成績在80與90之間,轉成“良好”
如果成績在90與100之間,轉成“優秀”
其他,轉成“錯誤”

簡單吧?想用編程來解決問題,首先要用偽代碼表明自己想明白了。
有了偽代碼,我們用特定編程語言翻譯一下,就是可用的產品代碼了,當然,我們在這要選用Java,小菜一碟了,翻譯好的MyUtil.java如下:

public class MyUtil{
   public static String percentage2fivegrade(int grade){
	   //如果成績小於60,轉成“不及格”
	   if (grade < 60)
		   return "不及格";
	   //如果成績在60與70之間,轉成“及格”
	   else if (grade < 70)
		   return "及格";
	   //如果成績在70與80之間,轉成“中等”
	   else if (grade < 80)
		   return "中等";
	   //如果成績在80與90之間,轉成“良好”
	   else if (grade < 90)
		   return "良好";
	   //如果成績在90與100之間,轉成“優秀”
	   else if (grade < 100)
		   return "優秀";
	   //其他,轉成“錯誤”
	   else 
		   return "錯誤";
   }
}

我們在IDEA中建一個項目,輸入上面的代碼:

產品代碼寫完了,如果別人要使用這個代碼,把MyUtil.java拷給他就可以了。但是作為負責任的你,肯定會擔心自己的程序會有Bug。如果別人用自己的代碼發現一堆Bugs,那多沒面子!怎么辦?寫了產品代碼,我們還要寫測試代碼,證明自己的代碼沒有問題。Java編程時,程序員對類實現的測試叫單元測試。類XXXX單元測試,我們一般寫建一個XXXXTest的類,針對MyUtil類我們寫一個MyUtilTest.java的測試模塊,代碼如下:

public class MyUtilTest {
    public static void main(String[] args) {
		// 百分制成績是50時應該返回五級制的“不及格”
		if(MyUtil.percentage2fivegrade(50) != "不及格")
			System.out.println("test failed!");
		else 
			System.out.println("test passed!");
	}
}

這里我們設計了一個測試用例(Test Case)測試用例是為某個特殊目標而編制的一組測試輸入、執行條件以及預期結果,以便測試某個程序路徑或核實是否滿足某個特定需求。這里我們的測試輸入是“50”,預期結果是“不及格”。

在 IDEA中我們把產品代碼放在src目錄中,把測試代碼放在test目錄中,右鍵單擊項目,在彈出的菜單中選擇New->Directory新建一個目錄:

輸入目錄名test:

test目錄中放的也是Java代碼,但IDEA不知道test中放的是源代碼。在命令行中我們知道要設置SOURCEPATH環境變量,在IDEA中我們右鍵單擊test目錄,在彈出的菜單中選擇Mark Directory as->Test Sources Root就可以了:

在IDEA中運行結果如下,測試結果符合預期:

只有一組輸入的測試是不充分的,我們把一般情況都測試一下,代碼如下:

 public class MyUtilTest {
	public static void main(String[] args) {
		//測試正常情況
		if(MyUtil.percentage2fivegrade(55) != "不及格")
			System.out.println("test failed!");
		else if(MyUtil.percentage2fivegrade(65) != "及格")
			System.out.println("test failed!");
		else if(MyUtil.percentage2fivegrade(75) != "中等")
			System.out.println("test failed!");
		else if(MyUtil.percentage2fivegrade(85) != "良好")
			System.out.println("test failed!");
		else if(MyUtil.percentage2fivegrade(95) != "優秀")
			System.out.println("test failed!");
		else 
			System.out.println("test passed!");
	}
}

在Eclipse中運行結果如下,測試結果符合預期:

我們不能只測試正常情況,下面看看異常情況如何,比如輸入為負分或大於100的成績,代碼如下:

 public class MyUtilTest {
	public static void main(String[] args) {
		//測試出錯情況
		if(MyUtil.percentage2fivegrade(-10) != "錯誤")
			System.out.println("test failed 1!");
		else if(MyUtil.percentage2fivegrade(115) != "錯誤")
			System.out.println("test failed 2!");
		else 
			System.out.println("test passed!");
	}
}

運行程序發現負分時與期望不一致,終於找到了一個bug,原因是判斷不及格時沒有要求成績大於零。我們修改MyUtil.java,增加對負分的判斷,代碼如下:

public class MyUtil{
   public static String percentage2fivegrade(int grade){
	   //如果成績小於0,轉成“錯誤”
	   if ((grade < 0))
		   return "錯誤";
	   //如果成績小於60,轉成“不及格”
       else if (grade < 60)
		   return "不及格";
	   //如果成績在60與70之間,轉成“及格”
	   else if (grade < 70)
		   return "及格";
	   //如果成績在70與80之間,轉成“中等”
	   else if (grade < 80)
		   return "中等";
	   //如果成績在80與90之間,轉成“良好”
	   else if (grade < 90)
		   return "良好";
	   //如果成績在90與100之間,轉成“優秀”
	   else if (grade < 100)
		   return "優秀";
	   //如果成績大於100,轉成“錯誤”
	   else
		   return "錯誤";
   }
}

再次運行測試,測試結果符合預期,如下圖所示:

測試夠了嗎?還不夠,一般代碼在邊界處最容易出錯,我們還沒有測試邊界情況,我們對輸入為“0,60,70,80,90,100”這些邊界情況進行測試的代碼如下:

public class MyUtilTest {
	public static void main(String[] args) {
		//測試邊界情況
		if(MyUtil.percentage2fivegrade(0) != "不及格")
			System.out.println("test failed 1!");
		else if(MyUtil.percentage2fivegrade(60) != "及格")
			System.out.println("test failed 2!");
		else if(MyUtil.percentage2fivegrade(70) != "中等")
			System.out.println("test failed 3!");
		else if(MyUtil.percentage2fivegrade(80) != "良好")
			System.out.println("test failed 4!");
		else if(MyUtil.percentage2fivegrade(90) != "優秀")
			System.out.println("test failed 5!");
		else if(MyUtil.percentage2fivegrade(100) != "優秀")
			System.out.println("test failed 6!");
		else 
			System.out.println("test passed!");	
	}
}

測試結果如下:

我們發現邊界情況中輸入100時有一個Bug。我們修改MyUtil.java,把判斷優秀的條件中包含輸入為100的情況,代碼如下:

public class MyUtil{
   public static String percentage2fivegrade(int grade){
	   //如果成績小於0,轉成“錯誤”
	   if ((grade < 0))
		   return "錯誤";
	   //如果成績小於60,轉成“不及格”
       else if (grade < 60)
		   return "不及格";
	   //如果成績在60與70之間,轉成“及格”
	   else if (grade < 70)
		   return "及格";
	   //如果成績在70與80之間,轉成“中等”
	   else if (grade < 80)
		   return "中等";
	   //如果成績在80與90之間,轉成“良好”
	   else if (grade < 90)
		   return "良好";
	   //如果成績在90與100之間,轉成“優秀”
	   else if (grade <= 100)
		   return "優秀";
	   //如果成績大於100,轉成“錯誤”
	   else
		   return "錯誤";
   }
}

這時測試都符合預期了,我們把MyUtil.java提供給別人使用時,心里比較有底氣了。那如何保證單元測度是充分的呢?我們的一般要求是測試代碼要比產品代碼多。如何寫測試,《單元測試之道》提出了Right-BICEP的方法,大家可以參考一下。

TDD(Test Driven Devlopment, 測試驅動開發)

前面的例子,我們先寫產品代碼,然后再寫測試代碼,通過測試發現了一些Bugs,提高了代碼質量。這有問題嗎?軟件開發從建築中吸取了很多營養,我們看看一個砌牆的例子,如下圖:
圖片描述信息
工人是“先把牆砌好的,再用繩子測一下牆平不平,直不直,如果不平或不直拆了重砌”,還是“先用繩子給出平和直的標准,然后靠着繩子砌牆,從而保證了牆砌出來就是又平又直的”呢?答案是不言而喻的了。
拿編程做對比,我們是該“先寫產品代碼,然后再寫測試代碼,通過測試發現了一些Bugs,修改代碼”,還是該“先寫測試代碼,然后再寫產品代碼,從而寫出來的代碼就是正確的”呢?當然先寫測試代碼了。這種先寫測試代碼,然后再寫產品代碼的開發方法叫“測試驅動開發”(TDD)。TDD的一般步驟如下:

  • 明確當前要完成的功能,記錄成一個測試列表
  • 快速完成編寫針對此功能的測試用例
  • 測試代碼編譯不通過(沒產品代碼呢)
  • 編寫產品代碼
  • 測試通過
  • 對代碼進行重構,並保證測試通過(重構下次實驗練習)
  • 循環完成所有功能的開發

基於TDD,我們不會出現過度設計的情況,需求通過測試用例表達出來了,我們的產品代碼只要讓測試通過就可以了。

Java中有單元測試工具JUnit來輔助進行TDD,我們用TDD的方式把前面百分制轉五分制的例子重寫一次,體會一下有測試工具支持的開發的好處。

IDEA中使用JUnit要安裝插件,選擇File->Setting打開設置對話框:

在設置對話框中選擇Plugins, 單擊Install JetBrains plugin...按鈕打開插件安裝界面:

在插件安裝對話框的搜索中輸入junit,單擊JunitGenerator V2.0,單擊右邊綠色的Install1按鈕安裝:

安裝完如下:

我們在IDEA中新建一個項目,然后新建一個空類MyUtil:

鼠標單擊類名會出現一個燈泡狀圖標,單擊圖標或按Alt + Entert,在彈出的菜單中選擇Create Test:

我們選擇創建JUnit3的測試用例 :

test 文件件夾中出現了MyUtilTest 測試類:

我們增加第一個測試用例testNormal,注意測試用例前一定要有注解@Test,測試用例方法名任意,輸入以下代碼:

import org.junit.Test;
import junit.framework.TestCase;
public class MyUtilTest extends TestCase {
	@Test
	public void testNormal() {
		assertEquals("不及格", MyUtil.percentage2fivegrade(55));
		assertEquals("及格", MyUtil.percentage2fivegrade(65));
		assertEquals("中等", MyUtil.percentage2fivegrade(75));
		assertEquals("良好", MyUtil.percentage2fivegrade(85));
		assertEquals("優秀", MyUtil.percentage2fivegrade(95));
	}
}

如果TestCase是紅色的,需要在IDEA中的項目(模塊)中加入junit.jar包,junit.jar包的位置可以在Everything中查找:

如上圖:junit.jar包的位置是“C:\Users\13015\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-1\171.4073.35\lib\junit.jar”

我們在IDEA中選擇菜單File->Project Structure...,

在彈出的對話框中選擇Dependancies標簽頁,單擊+號,選擇JARs or Directories...,輸入上面找到的“C:\Users\13015\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-1\171.4073.35\lib\junit.jar”。

輸入完畢,IDEA中如下圖所示:

紅色代碼說明有語法錯誤,這是因為MyUtil中還沒有percentage2fivegrade方法,點擊左邊的圖標可以修復這個問題:

percentage2fivegrade()方法中加入一行return "錯誤";

大家可以看到現在測試代碼沒有語法錯誤了,在測試代碼上單擊右鍵,選擇Run 'MyTuilTest':

運行結果如下:

測試結果出現了一個紅條(red bar),說明測試沒通過,紅條上面匯總了測試情況,運行了一個測試,沒有錯誤,一個測試沒通過。下面原因說的也很清楚:測試代碼第十行傳入55時,期望結果是“不及格”,代碼返回了“錯誤”,修改MyUtil.Java吧,輸入以下代碼,再運行測試,如下圖所示:

測試結果出現了一個綠條(green bar),說明測試通過了。TDD的目標是"Clean Code That Works",TDD的slogan是"Keep the bar green, to Keep the code clean",大家體會一下。

TDD的編碼節奏是:

  • 增加測試代碼,JUnit出現紅條
  • 修改產品代碼
  • JUnit出現綠條,任務完成

我們增加一個測試異常情況的用例testException和一個測試邊界情況的用例testBoundary,如下圖:

如何讓JUnit的gree bar出來,動手實驗一下,如下圖:

不管用不用TDD,寫出高質量的測試用例才是最重要的,如何進行單元測試,大家可參考一下《單元測試之道》這本書。另外,《Agile Java 中文版》展示了如何將Java和TDD進行有效的整合,通過TDD驅動項目開發,有興趣的可以參考。

返回目錄

重構

返回目錄

Git

Java的學習我是提倡首先在命令行下學習一段時間的,git也是,入門參考使用碼雲和博客園學習簡易教程

我們學習了IDE,如何在IDEA中使用git? 我們以使用碼雲和博客園學習簡易教程中建好的項目為例。

在IDEA中,我們選擇菜單File->New->Project from Version Control->git

彈出如下對話框,我們填上學習項目的URL,點擊Clone按鈕,這就相當於執行命令git clone https://git.oschina.net/bestiisjava2017/ljp20155200_JavaProgramming.git

其中的Git Repository URL來自碼雲:

IDEA 會詢問如何打開項目:

項目打開后,目錄都是灰的,IDEA不知道我們的源代碼在src文件夾里,教材上說了在命令行窗口中要設置SOURCEPATH環境,在IDEA中只要把鼠標放src文件夾上,在右鍵菜單中選擇Make Directory as->Sources Root:

src文件夾就變成藍色的了,IDEA就知道我們的源代碼在src文件夾里了。這時,Java API中的String,System都是紅色的,IDEA提示我們要Setup SDK,用鼠標點擊Setup SDK

如果以前設置過,選擇以前的設置,點擊OK按鈕:

如果以前沒設置過SDK,點擊上圖中的Configure...按鈕進行設置:

這時,Java API中的String,System都沒問題了:

我們運行Hello.java,IDEA會提示沒有輸出目錄,我們要創建一個bin文件夾,並指定為輸出目錄,點擊OK按鈕進行設置:

在彈出對話框中點擊右鍵,選擇New Folder...:

輸入要創建的文件夾名bin:

bin文件夾不應納入版本控制,我們點擊一下Excluded,bin文件夾變紅,不進行版本控制:

我們點擊Path標簽,指定Output path和Test output path 都是我們剛創建的bin:

代碼在IDEA中可以編譯運行了,Hello.class也生成在bin文件夾中了:

我們修改一下代碼,增加一行,編譯運行正確:

把鼠標放到Hello.java上,右鍵菜單選擇git->Commit File...,這相當於命令行“git add.; git commit”:

我們選中.idea和src,並在Commit Message中輸入信息。Commit Message是git commit -m "Commit Message"中的提交信息。Commit Message的編寫參考Commit message 和 Change log 編寫指南.

點擊Commit按鈕,我們可以選擇Commit and push,這在提交后會執行git push命令:

第一次執行要配置用戶名和E-mail,這相當於執行:

git config --global user.name "rocedu"  
git config --global user.email "rocedu@qq.com"

輸入碼雲上的用戶名和口令就能成功上傳了:

大家注意,這個教程只是入門,大家要在實踐中發現問題,解決問題,不斷精進。學習git命令時要在命令行下學習,然后在IDEA中找相關菜單項,這樣使用IDEA時才能知其然,也知其所以然。

返回目錄

代碼規范

現代軟件工程講義 3 代碼規范與代碼復審中說:

現代軟件產業經過幾十年的發展,已經不可能出現一個人單槍匹馬完成一個軟件的事情了,軟件都是在相互合作中完成的。

多人合作一定要有個共同的代碼規范,Java編程我們推薦《阿里巴巴Java開發手冊》,推薦你參加「阿里巴巴編碼規范」認證通過在線考試,檢測你對手冊中開發規范的掌握程度,並發放官方認證證書.

自《阿里巴巴Java開發手冊》發布以來,阿里對外開放了IDE檢測插件及源碼。該插件在掃描代碼后,將不符合《手冊》的代碼按block/critical/major三個等級顯示在下方;實時編寫代碼時,還會給出智能提示,告訴你如何編寫可以更優雅;對於歷史代碼,部分規則實現了批量一鍵修復的功能。

IDEA中的插件,我們通過Jetbrains官方倉庫安裝:打開 Settings ->Plugins -> Browse repositories...

在搜索框輸入alibaba即可看到Alibaba Java Code Guidelines插件,點擊Install進行安裝,然后重啟IDE生效:

使用比較簡單:在項目名稱上單擊右鍵,在彈出菜單上選擇編碼規約掃描

出現下圖內容:

不規范的地方,有中文提示並且定位到了行,alibaba把問題分為block/critical/major三個等級,有些規則可以一鍵修復。

返回目錄

Android

參考 Android開發簡易教程

返回目錄

數據庫

我們以MySQL為例,建議參考「 程序開發與信息安全工具箱」安裝XAMPP,我們后面以XAMPP為例說明。如果下載的XAMPP是Portable版的,解壓后注意先運行一下setup_xampp.bat,使用軟件時讀讀readme 會解決不少問題。

setup

  • JDBC(Java DataBase Connectivity)

    • api
    • ddi
  • 驅動的四種類型

    • JDBC-ODBC Bridge Driver
    • Native API Driver
    • JDBC-Net Driver
    • Native Protocal Driver

數據庫連接測試:

  • Java中連接數據庫的過程
    • 注冊Driver: DriverManager.registerDriver()
    • 獲取Connection: Connection conn = DriverManager.getConnection(jdbcUrl, userName, password)### ;
    • 關閉Connection:

在IDEA中新建項目TestJDBC,在src中輸入示例代碼 ConnectionDemo.java:

import static java.lang.System.out;
import java.sql.*;

public class ConnectionDemo {
    public static void main(String[] args)
                              throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        String jdbcUrl = "jdbc:mysql://localhost:3306/demo";
        String user = "root";
        String passwd = "";
        try(Connection conn = 
                DriverManager.getConnection(jdbcUrl, user, passwd)) {
            out.printf("已%s數據庫連接%n", 
                    conn.isClosed() ? "關閉" : "打開");
        } 
    }
}

數據庫連接測試,注意數據庫用戶名,口令要根據自己的實際情況修改,我們使用XAMPP,在XAMPP的readme_en.txt中給出了MySQL的用戶名和口令:

這個默認不要口令的方式不安全,實際應用中要改為安全的口令。

在XAMPP的安裝目錄中,點擊xampp-control.exe,通過點擊Apache和MySQL的start按鈕啟動Apache服務器和MySQL數據庫:

成功啟動如下圖所示:

我們上面代碼中用到了數據庫demo,我們在瀏覽器中輸入http://localhost 或http://127.0.0.1 打開XAMPP,

phpadmin

使用XAMPP中的PHPAdmin 建好數據庫並進行測試。建數據庫的SQL語句: CREATE SCHEMA demo;

createdb

后面還要用到一個留言板的表,建這個數據庫表的SQL語句是:

use demo;
CREATE TABLE t_message (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name CHAR(20) NOT NULL,
email CHAR(40),
msg TEXT NOT NULL
) CHARSET=UTF8;
	

下載並在IDEA中配置驅動mysql-connector-java-5.1.41-bin.jar (類似單元測試中加入junit.jar的方法)

程序運行結果如下:

在XAMPP中關閉MySQL,再運行一下程序試試。

Connection代表數據庫連接,要執行SQL語句要用到 java.sql.Statement,SQL語句的執行結果會返加ResultSet對象。

我們用在IDEA中,用MessageDAO來訪問數據庫表:

import java.sql.*;
import java.util.*;

public class MessageDAO {
    private String url;
    private String user;
    private String passwd;
    
    public MessageDAO(String url, String user, String passwd) {
        this.url = url;
        this.user = user;
        this.passwd = passwd;
    }

    public void add(Message message) {
        try(Connection conn = DriverManager.getConnection(url, user, passwd);
            Statement statement = conn.createStatement()) {
            String sql = String.format(
         "INSERT INTO t_message(name, email, msg) VALUES ('%s', '%s', '%s')",  
                  message.getName(), message.getEmail(), message.getMsg());
            statement.executeUpdate(sql);
        } catch(SQLException ex) {
            throw new RuntimeException(ex);
        }
    }

    public List<Message> get() {
        List<Message> messages = new ArrayList<>();
        try(Connection conn = DriverManager.getConnection(url, user, passwd);
            Statement statement = conn.createStatement()) {
            ResultSet result = 
                    statement.executeQuery("SELECT * FROM t_message");
            while (result.next()) {
                Message message = toMessage(result);
                messages.add(message);
            }
        } catch(SQLException ex) {
            throw new RuntimeException(ex);
        }
        return messages;
    }

    private Message toMessage(ResultSet result) throws SQLException {
        Message message = new Message();
        message.setId(result.getLong(1));
        message.setName(result.getString(2));
        message.setEmail(result.getString(3));
        message.setMsg(result.getString(4));
        return message;
    }
}


用Message 封裝留言信息:

import java.io.Serializable;

public class Message implements Serializable {
    private Long id;
    private String name;
    private String email;
    private String msg;

    public Message() {}
    
    public Message(String name, String email, String msg) {
        this.name = name;
        this.email = email;
        this.msg = msg;
    }
    
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }

    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

下面給出測試類MessageDAODEmo.java:

import static java.lang.System.out;
import java.util.Scanner;

public class MessageDAODemo {
    public static void main(String[] args) throws Exception {
        MessageDAO dao = new MessageDAO(
                "jdbc:mysql://localhost:3306/demo?" + 
                "useUnicode=true&characterEncoding=UTF8",
                "root", "");
        Scanner console = new Scanner(System.in, "Big5");
        while(true) {
            out.print("(1) 顯示留言 (2) 新增留言:");
            switch(Integer.parseInt(console.nextLine())) {
                case 1:
                    dao.get().forEach(message -> {
                        out.printf("%d\t%s\t%s\t%s%n", 
                                message.getId(), 
                                message.getName(), 
                                message.getEmail(), 
                                message.getMsg());
                    });
                    break;
                case 2:
                    out.print("姓名:");
                    String name = console.nextLine();
                    out.print("郵件:");
                    String email = console.nextLine();
                    out.print("留言:");
                    String msg = console.nextLine();
                    dao.add(new Message(name, email, msg));
            }
        }
    }
    
}

運行結果如下:

數據庫實例

數據庫的學習要有一定量的數據才有實際意義。一個學生數據庫讓你編出來1000個學生出來也很難,我們可以使用http://www.fakenamegenerator.com/幫忙產生測試數據。

我們學習練習時使用MySQL的World數據庫,我們去https://dev.mysql.com/doc/index-other.html下載world.sql,並導入到MySQL中:

返回目錄

其他

返回目錄

參考資料


歡迎關注“rocedu”微信公眾號(手機上長按二維碼)

做中教,做中學,實踐中共同進步!

rocedu



如果你覺得本文對你有幫助,請點一下左下角的“好文要頂”和“收藏該文



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM