Throwable java
|---Error //一般出現重大問題如:運行的類不存在或者內存溢出等。 正則表達式
|---Exception //運行時出現的一塊兒狀況 shell
|---RuntimeException //特殊異常類,拋時不須要聲明 數據庫
Exception和Error的子類名都是以父類名做爲後綴。 編程
異常體系的特色: 設計模式
1)異常體系中的全部類以及創建的對象都具有可拋性。 數組
2)也就是說能夠被throw和throws關鍵字所操做。 安全
1)編譯時被檢測異常: 網絡
該異常在編譯時,若是沒有處理(沒有拋也沒有try),編譯失敗。該異常被標識,表明着能夠被處理。 多線程
2)運行時異常(編譯時不檢測):
在編譯時,不須要處理,編譯器不檢查。該異常的發生,建議不處理,讓程序中止,須要對代碼進行修正例如:RuntimeException以及其子類。
四、throw和throws
throw定義在函數內,用於拋出異常對象。
throws定義在函數上,用於拋出異常類,能夠拋出多個用逗號隔開。
當函數內容有throw拋出異常對象,並未進行try處理。必需要在函數上聲明,不然編譯失敗。
Note:throws 和 throw 的區別:
throws 使用在函數上(寫在小括號和大括號之間)。throw 使用在函數內。
throws 後面跟的異常類。能夠跟多個。用逗號隔開。throw 後跟的是異常對象。
常見方法操做:
String getMessage();//獲取異常的信息。返回字符串。
toString();//獲取異常類名和異常信息,返回字符串。
printStackTrace(); //獲取異常類名和異常信息,以及異常出如今程序中的位置.返回值void.
//其實JVM默認的異常處理機制,就是在調用printStackTrace方法,打印異常的堆棧的跟蹤信息。
3) 當自定義了異常類繼承Exception後,若是未在類中定義異常信息,那麼經過toString方法打印出來的結果就只有自定義的異常類名,不會顯示異常信息。
4) 要定義自定義異常的信息時,可使用父類已經定義好的功能。異常信息傳遞給父類的構造函數。由於父類中已經把異常信息的操做都完成了。因此子類只要在構造時,將異常信息傳遞給父類經過super語句。那麼就能夠直接經過getMessage方法獲取自定義的異常信息。
class MyException extends Exception { private String msg; MyException(String msg) { super(msg);// 返回自定義的輸入信息 } }六、異常的好處:
/* 老師使用電腦講課。 描述電腦: 一、電腦運行 二、電腦重啓 描述電腦問題: 一、電腦藍屏了 二、電腦起火了 描述老師: 一、老師使用電腦 二、老師講課。 描述老師可能出現的問題: 一、老師不能繼續講課了,他讓同窗們本身作練習。 */ //電腦藍屏了 class BlueScreenException extends Exception { BlueScreenException(String message) { super(message); } } //電腦起火了 class FireBreakingException extends Exception { FireBreakingException(String message) { super(message); } } //老師沒法繼續上課 class StopTeachException extends Exception { StopTeachException(String message) { super(message); } } class Computer { int start=1; //電腦啓動 void run()throws BlueScreenException,FireBreakingException { if(start==2) throw new BlueScreenException("Computer_BlueScreen"); else if(start==3) throw new FireBreakingException("Computer_FireBreaking"); System.out.println("Computer_run"); } //電腦重啓 void reset() { start=1; System.out.println("Computer_reset"); } } class Teacher { private String name; private Computer cpt; //對老師進行初始化 Teacher(String name) { this.name=name; cpt=new Computer(); } //老師開始講課 public void teach()throws StopTeachException { try { cpt.run(); } catch (BlueScreenException e) { //System.out.println(e.getMessage()); cpt.reset(); } catch (FireBreakingException e) { test(); //System.out.println(e.getMessage()); throw new StopTeachException("Teather_StopTeach:"+e.getMessage()); } System.out.println(name+"Teacher_teaching"); } void test() { System.out.println("學生作練習"); } } class ExceptionTest { public static void main(String[] args) { Teacher t=new Teacher("畢老師"); try { t.teach(); } catch (StopTeachException e) { System.out.println(e.toString()); System.out.println("換老師或者放假"); } } }2、經常使用類
1)獲取
1.1字符串中包含的字符數,也就是字符串的長度
int length()://獲取長度。
1.2根據位置獲取位置上的某個字符
char charAt(int index)://當訪問到字符串中不存在的角標時,會發生字符串角標越界的錯誤。
1.3根據字符獲取該字符存在字符串的位置
int indexOf(int ch)://返回的是ch在字符串中第一次出現的位置。//傳入的是字符對應的ASCII碼。//若是沒有找到,返回-1。
int indexOf(int ch,int fromIndex)://從fromIndex指定位置開始,獲取ch在字符串中出現的位置。
int indexOf(String str)://返回的是str在字符串中第一次出現的位置。
int indexOf(String str,int fromIndex)://從fromIndex指定位置開始,獲取str在字符串中出現的位置。
int lastIndexOf()://反向索引
2)判斷
2.1字符串中是否包含某一個子串
boolean contains(str);
Note:indexOf(str)能夠索引str第一次出現的位置,若是返回-1表示該str不在字符串中存在。因此,也能夠用於對指定判斷是否包。 如:if(str.indexOf(「aa」)!=-1)並且該方法既能夠判斷,又能夠獲取出現的位置。若是隻爲判斷,用contains。
2.2字符串中是否有內容
boolean isEmpty();//原理就是判斷長度是否爲0。
2.3字符串是不是以指定內容開頭
boolean startsWith(str);
2.4字符串是不是以指定內容結尾
boolean endsWith(str);
2.5判斷字符串內容是否相同,複寫了Object類中的equals方法
boolean equals(str);
2.6判斷內容是否相同,並忽略大小寫。
boolean equalsIgnoreCase();
3)轉換
3.1將字符數組轉成字符串
構造方法:String(char[]);
String(char[],offset,count);//將字符數組中的一部分轉成字符串。
靜態方法:
static String copyValueOf(char[]);
static String copyValueOf(char[] data,int offset ,int count );
static String valueOf(char[]);
3.2將字符串轉成字符數組
char[] toCharArray();
3.3將字節數組轉成字符串
String(byte[]);
String(byte[],offset,count);//將字節數組中的一部分轉成字符串。count表示個數。
3.4將字符串轉成字節數組
byte[] getBytes();
3.5將基本數據類型轉成字符串
String valueOf(int);
String valueOf(double);
Note:字符串和字節數組在轉換過程當中,是能夠指定編碼表的。
4)替換
String replace(oldchar,newchar);//返回的是一個新字符串。若是要替換的字符不存在,返回的仍是原字符串。
5)切割
String[] split(regex);//涉及到正則表達式的點,不能做爲切割字符串的regex。
6)子串,獲取字符串中的一部分
String substring(begin);//從指定位置開始到結尾。若是角標不存在,會出現字符串角標越界異常。
String substring(begin,end);//包含頭,不包含尾。
7)轉換,去除空格,比較
7.1將字符串轉成大寫或小寫
String toUpperCase();
String toLowerCase();
7.2將字符串兩端的多個空格去除
String trim();
7.3對兩個字符串進行天然順序的比較
int compareTo(String);
基於上述知識點,幾個小練習演示以下所示:/* * 練習:一、字符串反轉 * 二、獲取一個字符串在另外一個字符串中出現的次數 * 三、有兩個字符串,找出兩個字符串中最大相同那個字符串 */ public class StringTest { // 一、字符串反轉 public static String reverseString(String str) { char[] ar = str.toCharArray();// 將字符串轉成字符數組 reverse(ar);// 將字符數組進行反轉 return new String(ar);// 返回反轉後的字符串 } // 逐個調換字符數組中的對應位置的字符 public static void reverse(char[] ar) { for (int i = 0, j = ar.length - 1; i < j; i++, j--) { swap(ar, i, j); } } // 自定義反轉數組中的兩個元素 private static void swap(char[] ar, int i, int j) { char temp = ar[i]; ar[i] = ar[j]; ar[j] = temp; } // 二、獲取一個字符串在另外一個字符串中出現的次數 public static int getNumOfString(String str, String key) { int num = 0;// 定義計數器 int index = 0;// 定義腳標,用於記錄查詢位置 while ((index = str.indexOf(key, index)) != -1) { // indexOf(key) 或者indexOf(key,beginIndex)均可以 // str = str.substring(index + key.length()); index = index + key.length();// 下一次的查詢其實位置是前一次查詢返回值加上字符串長度,以此保證每次都是日後偏移查詢 num++;// 查到一次,計數器自增1 } return num; } // 三、有兩個字符串,找出兩個字符串中最大相同那個字符串 public static String getMaxSubString(String str1, String str2) { // 不論傳進來的兩個字符串誰更長,自定義maxString、minString來指向長字符串和短字符串 String maxString = str1.length() > str2.length() ? str1 : str2; String minString = maxString == str1 ? str2 : str1; String maxSubString = null; for (int i = 0; i < minString.length(); i++) {// 控制在最短字串長度內 // 依次遞減短字符串子串 for (int j = 0, k = minString.length() - i; k <= minString.length(); j++, k++) { maxSubString = minString.substring(j, k);// 獲取短字符串的子串 if (maxString.indexOf(maxSubString) != -1) {// 若是包含在長字符串中則代表找到了 return maxSubString; } } } return "-1"; } public static void main(String[] args) { String str = "abc cde"; String s1 = "ascasfhelloasfasf v"; String s2 = "ashellolkkd"; System.out.println(reverseString(str)); System.out.println(getNumOfString(str, "c")); System.out.println(getMaxSubString(s2, s1)); } }結果以下所示:
常見操做:
1)存儲
StringBuffer append():將指定數據做爲參數添加到已有數據的結尾處。
StringBuffer insert(intoffset ,數據):能夠將數據插入到指定offset位置。
2)刪除
StringBufferedelete(start,end):刪除緩衝區中的數據,包含start,不包含end。
StringBuffer deleteCharAt(index):刪除指定位置的字符。//清空緩衝區:對象.delete(0,對象.length());
3)獲取
char charAt(int index);
int indexOf(String str);
int lastIndexOf(String str);
int length();
String substring(int start,int end);
4)修改
StringBuffer replace(int start,int end,String str);
void setCharAt(int index,char ch);
5)反轉
StringBuffer reverse();
6)將緩衝區中指定數據存儲到指定字符數組中
voidgetChars(int srcBegin, int srcEnd,char[] dst,int dstBegin)
四、StringBuilder類
概述:StringBuilder在JDK1.5 版本以後出現的,一個可變的字符序列。此類提供一個與 StringBuffer 兼容的 API,但不保證同步。該類被設計用做 StringBuffer 的一個簡易替換, 用在字符串緩衝區被單個線程使用的時候(這種狀況很廣泛)。若是可能,簡易優先採用 StringBuilder 類,由於此類比 StringBuffer 效率高。
StringBuilder 和 StringBuffer 的功能是同樣的,可是有區別:
StringBuffer(JDK1.0)是線程安全的。通常用於多線程。
StringBuilder(JDK1.5)不保證線程安全。通常用於單線程。
Note:通常來講,咱們寫的程序都是單線程的,因此,用 StringBuilde,效率高,之後開發建議使用 StringBuilder。
import java.text.SimpleDateFormat; import java.util.Date; /* * Date類: * 一、獲取系統當前時間 * 二、利用SimpleDateFormat類格式化指定時間 */ public class DateDemo { public static void main(String[] args) { // 第一種獲取方式 Date date1 = new Date(); // 第二種獲取方式 long time = System.currentTimeMillis(); Date date2 = new Date(time); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒"); String needDate = sdf.format(date2); System.out.println("系統時間戳:" + date2); System.out.println("格式化時間:" + needDate); System.out.println("格式化模板:" + sdf.toPattern()); } }結果以下:
import java.util.Calendar; /* * Calendar類: * set() 給指定日曆設置給定值 * get() 獲取指定字段 * * add() 在指定時間上加上一個指定的值再顯示 */ public class CalendarDemo { public static void main(String[] args) { // 獲取某年2月的天數,例如2012年的2月有幾天 Calendar c = Calendar.getInstance(); // 3月1日減一天就是2月的最後一天,Calendar月份範圍0-11 c.set(2012, 2, 1); c.add(Calendar.DAY_OF_MONTH, -1); System.out.println(c.get(Calendar.YEAR) + "年" + (c.get(Calendar.MONTH) + 1) + "月共有" + c.get(Calendar.DAY_OF_MONTH)); // 日曆設置到2個月後 c.add(Calendar.MONTH, 2); System.out.println("日曆設置到2個月後是" + c.get(Calendar.YEAR) + "年" + (c.get(Calendar.MONTH) + 1) + "月" + c.get(Calendar.DAY_OF_MONTH) + "日"); } }結果以下:
/* GUI:文本框和文本區域功能等(對話框) */ import java.awt.*; import java.awt.event.*; import java.io.*; public class MyWindowDemo { private Frame f; private TextField tf; private Button but; private TextArea ta; private Dialog d; private Label lab; private Button okBut; MyWindowDemo() { init(); } public void init() { f = new Frame("my window"); f.setBounds(300, 100, 600, 500); f.setLayout(new FlowLayout()); tf = new TextField(60); but = new Button("轉到"); ta = new TextArea(25, 70); // 此處不該該直接初始化對話框等組件,通常處理用戶出錯問題再建立使用對話框 // 這裏只爲演示看效果。 d = new Dialog(f, "提示信息-self", true); d.setBounds(400, 200, 240, 150); d.setLayout(new FlowLayout()); lab = new Label(); okBut = new Button("肯定"); d.add(lab); d.add(okBut); // 注意:不要將對話框添加到frame中,只有出現問題纔會調用出現對話框 f.add(tf); f.add(but); f.add(ta); myEvent(); f.setVisible(true); } private void myEvent() { okBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { d.setVisible(false); } }); d.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { d.setVisible(false); } }); tf.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) showDir(); } }); but.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { showDir(); } }); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } private void showDir() { String dirPath = tf.getText(); File dir = new File(dirPath); if (dir.exists() && dir.isDirectory()) { ta.setText("");// 清空文本 String[] names = dir.list(); for (String name : names) { ta.append(name + "\r\n");// 追加文本 } } else { String info = "您輸入的信息:" + dirPath + "是錯誤的。請重輸"; lab.setText(info); d.setVisible(true); } } public static void main(String[] args) { new MyWindowDemo(); } }結果以下:
import java.util.regex.Matcher; import java.util.regex.Pattern; /* * 正則表達式: * 做用:用於操做字符串 * 特色:用於一些特定的字符串來表達一些代碼操做---到達簡化效果 * 好處:能夠簡化對字符串的校驗操做 * 弊端:符號定義越多,正則越長,閱讀性極差 * * 具體操做功能: * 一、匹配:String matches(regex) * 二、切割:String[] split(String regex) * 三、替換:String replaceAll(String regex, String replacement) * 四、獲取:將字符串中符合規則的子串取出 * 操做步驟: * 1)將正則表達式封裝成對象 * 2)讓正則對象和藥操做的字符串相關聯 * 3)獲取正則匹配引擎 * 4)經過引擎對符合規則的子串進行取出 * * */ public class RegexDemo { public static void main(String[] args) { System.out.println("---------checkQQ-----------"); checkQQ(); System.out.println("---------regexDemo1-----------"); regexDemo1(); System.out.println("---------checkPhonenum-----------"); checkPhonenum(); System.out.println("---------splitDemo-----------"); splitDemo(); System.out.println("---------replaceAllDemo-----------"); replaceAllDemo(); System.out.println("---------getDemo-----------"); getDemo(); } // 獲取 public static void getDemo() { String str = "zhong guan cong hei ma di shi er qi jiu yao kai ban le."; System.out.println("字符串:" + str); String regex = "\\b[a-z]{4}\\b"; // 將規則封裝成對象 Pattern p = Pattern.compile(regex); // 讓正則對象和要做用的字符串相關聯,獲取匹配器對象 Matcher m = p.matcher(str); // String類中的matches()用的就是Pattern和Matcher對象來完成的,僅僅爲了使用簡單而封裝的,功能單一 // 將規則做用到字符串上,並進行符合規則的子串查找 // boolean flag = m.find(); // System.out.println(flag); // System.out.println(m.group());// 用於獲取匹配後的結果 System.out.println("獲取結果爲:"); while (m.find()) { System.out.println(m.group()); System.out.println(m.start() + "..." + m.end()); } } // 替換 public static void replaceAllDemo() { String str = "wwwwwwwitheimaaaaacom"; // 用「#」替換數字 // String repstr = str.replaceAll("\\d{5,}", "#"); // 將疊詞替換& // String repstr = str.replaceAll("(.)\\1+", "&"); // 將重疊的字母替換成單個字母,用$n(n爲前面的組標識)獲取前面的組 String repstr = str.replaceAll("(.)\\1+", "$1"); System.out.println("字符串:" + str + "替換後結果爲:" + repstr); } // 切割 public static void splitDemo() { String str = "wwwkkitheimaqqcom"; // str = "d:\\abc\\a.txt"; // .表明任何字符(與行結束符可能匹配也可能不匹配)要使用必須轉義 \\. // String regex = "\\."; // 路徑分隔符\\對應的regex爲\\\\ // String regex = "\\\\"; // 按照疊詞切割. // 爲了讓規則的結果被重用,能夠講規則封裝成一個組,用()完成。 // 組的出現都有編號,從1開始,要想使用就能夠經過\n(n爲租的編號)表示 String regex = "(.)\\1+"; String[] arr = str.split(regex); System.out.println("切割結果以下:"); for (String ar : arr) { System.out.println(ar); } } // 匹配測試1 public static void regexDemo1() { String str = "a111111"; String regex = "[a-z]\\d{3,5}"; System.out.println("匹配測試1" + str.matches(regex)); } // 匹配手機號:手機號段 13xxx 15xxx 18xxx public static void checkPhonenum() { String phone = "18767330882"; String regex = "1[358]\\d{9}"; boolean flag = phone.matches(regex); if (flag) { System.out.println("驗證手機號" + phone + "---is ok"); } else { System.out.println("驗證手機號" + phone + "---is wrrong"); } } // 驗證QQ號,不能0開頭,5-15位,不能有字符 public static void checkQQ() { String qq = "1512465"; String regex = "[1-9]\\d{4,14}"; boolean flag = qq.matches(regex); if (flag) { System.out.println("驗證QQ號" + qq + "---is ok"); } else { System.out.println("驗證QQ號" + qq + "---is wrrong"); } } }結果如圖所示:
import java.util.Collections; import java.util.TreeSet; /* * 功能選擇: * 一、只想知道是否正確————>匹配 * 二、想要將已有的字符串便稱另外一個字符串————>替換 * 三、想要按照本身的規則將字符串變成多個子串————>切割 * 四、想要拿到符合需求的字符串子串————>獲取 */ public class RegexTest { public static void main(String[] args) { System.out.println("----------regexTest1----------"); regexTest1(); System.out.println("----------ipSort----------"); ipSort(); System.out.println("----------checkMail----------"); checkMail(); } // 對郵件地址進行驗證。 public static void checkMail() { String mail = "cavenzzep@163.com.cn"; String regex = "\\w+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}"; System.out.println(mail.matches(regex)); } // * 練習需求: 將下面的字符串轉換成(我要進黑馬) public static void regexTest1() { String str = "我我...我我...我要...要要要...要去...去去去...去北京...京京京"; // 將已有的字符串變成另外一個字符串————>替換 // 一、先將.去掉 // 二、將重複的內容變成單個子符內容 str = str.replaceAll("\\.+", ""); System.out.println(str); str = str.replaceAll("(.)\\1+", "$1"); System.out.println(str); } // 將ip地址進行地址段順序排序 public static void ipSort() { String ip = "192.168.0.1 2.2.2.1 168.192.10.10 10.10.10.10 254.254.254.1 255.255.255.1"; ip = ip.replaceAll("(\\d+)", "00$1"); System.out.println(ip); ip = ip.replaceAll("0*(\\d{3})", "$1"); System.out.println(ip); String[] ips = ip.split(" "); TreeSet<String> tree = new TreeSet<String>(Collections.reverseOrder()); for (String newIp : ips) { // System.out.println(newIp); tree.add(newIp); } for (String s : tree) { System.out.println(s.replaceAll("0*(\\d+)", "$1")); } } }結果如圖所示: