Java異常(一)
*************************如何處理異常********************************
try{
//可能出現錯誤的代碼
}catch(異常類的類名 e){
//處理錯誤的代碼
}
演示代碼:
package com.chapter10;
//演示如何處理異常
public class TestTryCatch {
public static void main(String[] args) {
String[] friendsArr = { "tom", "john", "jenni" };
try{
for (int i = 0; i < 4; i++) {
System.out.println(friendsArr[i]);//當訪問下標為3的元素的時候 報錯 程序終止
}
}catch(ArrayIndexOutOfBoundsException e){
e.printStackTrace();//打印棧軌跡 最最簡單 最最偷懶的方式
System.out.println("數組下標越界了");
}
//處理完錯誤以後 程序就是一個正常的程序了 就可以往下繼續運行
System.out.println("here");
}
}
處理錯誤的時候 最簡單的、最最偷懶的方式 就是只打印棧軌跡,不推薦..因為之前我們看到了
即使不做任何處理,虛擬機默認的處理方式就是打印棧軌跡...至少應該有一個良好的提示...
註意: Java中的異常處理不能從根本上修正錯誤,只是一個良好的提示作用,如果能幫我們
把4-->3 這不叫異常處理,這是人工智能..
*************************異常的分類(一個圖)********************************
本章重點: 一個圖、5個關鍵字
一個圖:
Throwable(可拋出物 java中所有異常類的基類)
Error Exception
RuntimeException Others(CheckedException)
Error: 非常嚴重的錯誤..程序員在程序這個層次修改不了,例如硬件崩潰、操作系統崩潰、虛擬機崩潰...
開車時, 地震了...
Exception: 不太嚴重的錯誤。程序員可以通過修改程序來完成...
*************************Error 非常嚴重的錯誤******************************************
Error: 非常嚴重的錯誤..程序員在程序這個層次修改不了,例如硬件崩潰、操作系統崩潰、虛擬機崩潰...
開車時, 地震了...
內存溢出(內存不夠用)
一.棧溢出
StackOverflowError
遞歸
棧深度: 棧能容納方法調用的方法的個數...
演示代碼:
package com.chapter10.error;
//演示棧溢出
public class TestStackOverflowError {
private int sum;
public void test(){
if(sum<=17000){
sum++;
test();
System.out.println("test方法被調用了");
}
}
public static void main(String[] args) {
TestStackOverflowError t = new TestStackOverflowError();
t.test();
}
}
二.堆溢出
OutOfMemoryError: Java heap space
long[] longArr = new long[125000000];
三.方法區
OutOfMemoryError: permgen space
當項目比較大的時候 同時使用n多類文件 類文件把方法區占滿 會報方法區溢出
可以通過修改 MyEclipse下的myeclipse.ini 配置文件調整堆、方法區、棧的默認大小
*************************Exception 異常*****************************************
不太嚴重的錯誤,程序員可以通過修改代碼來完成
具體又分為兩種:
1.RuntimeException
運行時異常 運行的時候發生的錯誤 可以處理也可以不處理 就像開車中 遇見的小石子
2.Others(CheckedException)
檢查性異常 編譯時的異常 必須被處理 不處理編譯不通過 就像開車中汽車拋錨
*************************RuntimeException ******************************************
運行時異常 運行的時候發生的錯誤 可以處理也可以不處理 就像開車中 遇見的小石子
五種常見的運行時異常(面試題)
1. 數組下標越界 ArrayIndexOutOfBoundsException
2. 算數異常 ArithmeticException
3. 空指針異常 NullPointerException (重點)
什麽時候會出現空指針異常
(1) 在null上調用方法
(2) null上訪問屬性
4. 類轉換異常 ClassCastException
5. 數字格式化異常 NumberFormatException
演示代碼:
package com.chapter10.exception.runtimeException;
//演示五種常見的運行時異常
public class TestRuntimeException {
public static void main(String[] args) {
//1. 數組下標越界 ArrayIndexOutOfBoundsException
//2. 算數異常 ArithmeticException
/*int a = 10/0;
System.out.println(a);*/
//3.空指針異常 NullPointerException (重點)
//什麽時候會出現空指針異常?
//(1) 在null上調用方法
//Student s = new Student();
//s.study();
//(2) null上訪問屬性
/*Student s = null;
System.out.println(s.sno);*/
//4. 類轉換異常 ClassCastException
/*Person student = new Student();
Teacher teacher = (Teacher)student;*/
//5.數字格式化異常 NumberFormatException
try{
int a = Integer.parseInt("11");
System.out.println(a);
}catch(NumberFormatException e){
e.printStackTrace();
System.out.println("數字格式化異常");
}
System.out.println("here");
}
}
**************************Others(CheckedException)******************************
檢查性異常、編譯期的異常,必須被處理,不處理編譯不通過..就像開車時汽車拋錨
處理方式有兩種:
1. 使用try..catch 明確的處理
駕駛員自己會修
2. 使用throws 拋出給調用者處理
讓別人修,讓修理工修
檢查性異常體現了java程序的健壯性...
***************************演示檢查性異常的特點**************************
沒有出現異常的情況
演示代碼
package com.chapter10.exception.checkedException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
//演示檢查性異常
//必須被處理 不處理編譯不通過 就像開車中汽車拋錨
//處理完畢以後 程序才能編譯通過
public class TestCheckedException {
public static void main(String[] args) {
//讀文件
try{
FileInputStream fis = new FileInputStream("d:\\jidi16\\aaa.txt");
System.out.println("aaa");
}catch(FileNotFoundException e){
e.printStackTrace();
System.out.println("文件沒有找到");
}
System.out.println("here");
}
}
***************************出現了異常並且捕獲了**************************
拋出-捕獲機制
註意: 不會回到錯誤發生的地方,繼續往下執行
***************************不能有過大的try塊**************************
Java異常(一)