本篇文章為大家帶來了關於java的相關知識,其中主要介紹了關於異常的相關問題,異常又稱為例外,是一個在程式執行期間發生的事件,它中斷正在執行程式的正常指令流,下面一起來看一下,希望對大家有幫助。
推薦學習:《java影片教學》
Java中的例外(Exception )又稱為例外,是一個在程式執行期間發生的事件,它中斷正在執行程式的正常指令流。為了能夠及時有效地處理程式中的運行錯誤,必須使用異常類別。
在Java中異常產生,主要是有三種原因:
#(1)編寫程式碼中的錯誤產生的異常,例如數組越界、空指標異常等,這種異常叫做未檢查的異常,一般需要在類別中處理這些異常
(2 )Java內部錯誤發生的異常,Java虛擬機產生異常
#(3)透過throw(拋出異常)語句手動產生的異常,這種異常叫做檢查的異常,一般是用來給方法呼叫者一些必要的資訊
(1)Throwable:是例外系統的頂層類,其衍生出兩個重要的子類別, Error 和Exception
# 而Error 和Exception 兩個子類別分別表示錯誤和例外。
差異是不檢查例外(Unchecked Exception)和檢查異常(Checked Exception)。
(2)Exception 類別用於使用者程式可能出現的異常情況,它也是用來建立自訂異常類型類別的類別。
(3)Error 定義了在通常環境下不希望被程式捕獲的例外。 Error 類型的異常用於 Java 運行時由系統顯示與運行時系統本身相關的錯誤。堆疊溢位是這種錯誤的一例。
異常可能在編譯時發生,也有可能在程式執行時發生,根據發生時機不同,可以分為:
執行階段異常都是RuntimeException 類別及其子類別異常,如NullPointerException、IndexOutOfBoundsException 等,這些異常是不檢查異常,程式中可以選擇捕獲處理,也可以不處理。這些異常一般由程式邏輯錯誤所引起,程式應該從邏輯角度盡量避免這類異常的發生。
例如:
#編譯時異常是指RuntimeException 以外的例外,類型上都屬於Exception 類別及其子類別。從程式語法角度講是必須進行處理的異常,如果不處理,程式就不能編譯通過。如 IOException、ClassNotFoundException 等以及使用者自訂的 Exception 異常,一般情況下不自訂檢查異常。
例如
class Person implements Cloneable{ @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } public class Test01 { public static void main(String[] args) { Person person =new Person(); Person person1 =(Person) person.clone(); } }
錯誤在程式碼中是客觀存在的. 所以要讓程式出現問題的時候快速通知程式猿. ##通知有兩種方式:
(1)LBYL 在操作之前就做充分的檢查# 缺点:正常流程和错误处理流程代码混在一起, 代码整体条理不清晰。 (2)EAFP 先操作遇到问题再处理 优点:正常流程和错误流程是分离开的, 程序员更关注正常流程,代码更清晰,容易理解代码 处理异常的核心思想就是EAFP 在编写程序时,如果程序中出现错误,这就需要将错误的信息通知给调用者 这里就可以借助关键字throw,抛出一个指定的异常对象,将错误信息告知给调用者。 比如写一个运行时异常 注意: (1)throw必须写在方法体内部 (2)如果抛出的是编译时异常,用户就必须要处理,否则无法通过编译
(3)如果抛出的运行时异常,则可以不用处理,直接交给JVM来处理 (4)一旦出现异常,后面的代码就不会执行 throws处在方法声明时参数列表之后,当方法中抛出编译时异常,用户不想处理该异常, 此时就可以借助throws将异常抛 给方法的调用者来处理。 格式:
修饰符 返回值类型 方法名(参数列表) throws 异常类型 {
}
如果说方法内部抛出了多个异常,throws之后就必须跟多个异常类型,用逗号进行分隔 如果抛出多个异常类型有父子关系,直接声明父类 调用声明抛出异常的方法时,调用者必须对该异常进行处理,或者继续使用throws抛出 当程序抛出异常的时候,程序员通过try-each处理了异常 如果程序抛出异常,不处理异常,那就会交给JVM处理,JVM处理就会把程序立即终止 并且,即使用了try-each 也必须捕获一个对应的异常,如果不是对应异常,也会让JVM进行处理 如果try抛出多个异常,就必须用多个catch进行捕获 这里注意,用多个catch进行捕获,不是同时进行捕获的,因为不可能同时抛不同的异常 也可以简写一下 如果异常之间具有父子关系,那就必须子类异常在前,父类异常在后catch,不然会报错 finally用来进行资源回收,不论程序正常运行还是退出,都需要回收资源 并且异常会引发程序的跳转,可能会导致有些语句执行不到 如果不为空,那么finally还会被执行吗 所以,不管程序会不会抛出异常,finally都会执行 如果将资源写在try中会自动帮助,关掉资源的 下面看这一段代码 可以发现即使有return,finally也会被执行 总结一下: throw抛出异常,throws声明异常 finally语句一定会执行 虽然java中有很多异常类,但是在实际开发中所遇到的一些异常,不能完全表示, 所以这就需要我们自定义异常类 举一个例子 先自定义一个运行时异常 写一个类来捕获这个自定义异常 下面写一个用户登录的自定义异常类 注意: 自定义异常默认会继承 Exception 或者 RuntimeException 继承于 Exception 的异常默认是受查异常 继承于 RuntimeException 的异常默认是非受查异常 推荐学习:《java视频教程》private static int pide() {
int a = 0, b = 0;
Scanner scanner = new Scanner(System.in);
a = scanner.nextInt();
b = scanner.nextInt();
if (b == 0) {
System.out.println("除数为0");
return 0;
} else {
return a / b;
}
}
private static int pide() {
int a = 0, b = 0;
try (Scanner scanner = new Scanner(System.in)) {
a = scanner.nextInt();
b = scanner.nextInt();
return a / b;
} catch (ArithmeticException exception) {
System.out.println("除数为0");
return 0;
}
}
2.2 异常的抛出(throw)
public static void func2(int a) {
if(a == 0) {
//抛出的是一个指定的异常,最多的使用方式是,抛出一个自定义的异常
throw new RuntimeException("a==0");
}
}
public static void main(String[] args) {
func2(0);
}
2.3 异常的捕获
2.3.1 throws异常声明
public static void func2(int a) throws CloneNotSupportedException, FileNotFoundException {
if(a == 0) {
throw new CloneNotSupportedException("a==0");
}
if(a == 1) {
throw new FileNotFoundException();
}
}
public static void func2(int a) throws Exception {
if(a == 0) {
throw new CloneNotSupportedException("a==0");
}
if(a == 1) {
throw new FileNotFoundException();
}
}
public static void main(String[] args) throws FileNotFoundException, CloneNotSupportedException {
func2(0);
}
2.3.2 try-catch捕获异常并处理
public static void main(String[] args) {
try {
int[] array = null;
System.out.println(array.length);
}catch (NullPointerException e) {
System.out.println("捕获到了一个空指针异常!");
}
System.out.println("其他程序!");
}
public static void main(String[] args) {
try {
int[] array = null;
System.out.println(array.length);
}catch (NullPointerException e) {
System.out.println("捕获到了一个空指针异常!");
}catch (ArithmeticException e) {
System.out.println("捕获到了一个算术异常!");
}
System.out.println("其它代码逻辑!");
}
public static void main(String[] args) {
try {
int[] array = null;
System.out.println(array.length);
}catch (NullPointerException | ArithmeticException e) {
System.out.println("捕获到了一个空指针或算术异常!");
}
System.out.println("其它代码逻辑!");
}
public static void main(String[] args) {
try {
int[] array = null;
System.out.println(array.length);
}catch (NullPointerException e) {
System.out.println("捕获到了一个空指针异常!");
}catch (Exception) {
System.out.println("捕获到了一个算术异常!");
}
System.out.println("其它代码逻辑!");
}
2.3.3 finally
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
try {
int[] array = null;
System.out.println(array.length);
}catch (NullPointerException e) {
System.out.println("捕获到了一个空指针异常!");
}catch (ArithmeticException e) {
System.out.println("捕获到了一个算术异常!");
}finally {
scanner.close();
System.out.println("进行资源关闭!");
}
System.out.println("其它代码逻辑!");
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
try {
int[] array = {1,2,3};
System.out.println(array.length);
}catch (NullPointerException e) {
System.out.println("捕获到了一个空指针异常!");
}catch (ArithmeticException e) {
System.out.println("捕获到了一个算术异常!");
}finally {
scanner.close();
System.out.println("进行资源关闭!");
}
System.out.println("其它代码逻辑!");
}
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
int[] array = {1, 2, 3};
System.out.println(array.length);
} catch (NullPointerException e) {
System.out.println("捕获到了一个空指针异常!");
} catch (ArithmeticException e) {
System.out.println("捕获到了一个算术异常!");
} finally {
System.out.println("进行资源关闭!");
}
System.out.println("其它代码逻辑!");
}
public static int func(int a) {
try{
if(a == 0) {
throw new ArithmeticException();
}
return a;
} catch (ArithmeticException e) {
System.out.println("算术异常!");
} finally {
return 20;
}
}
public static void main(String[] args) {
System.out.println(func(10));
}
3.自定义异常类
//自定义了一个运行时异常
public class MyException extends RuntimeException{
public MyException() {
}
public MyException(String message) {
super(message);
}
}
public class Test04 {
public static void func(int a ) {
throw new MyException("呵呵!");
}
public static void main(String[] args) {
try {
func(20);
}catch (MyException myException) {
myException.printStackTrace();
}finally {
System.out.println("sadasdasd");
}
}
}
class UserNameException extends RuntimeException {
public UserNameException() {
}
public UserNameException(String message) {
super(message);
}
}
class PasswordException extends RuntimeException {
public PasswordException() {
}
public PasswordException(String message) {
super(message);
}
}
public class LogIn {
private static String uName = "admin";
private static String pword = "1111";
public static void loginInfo(String userName, String password) {
if ( !uName.equals(userName)) {
throw new UserNameException("用户名错误!");
}
if ( !pword.equals(password)) {
throw new RuntimeException("密码错误!");
}
System.out.println("登录成功!");
}
public static void main(String[] args) {
try {
loginInfo("admin","1111");
} catch (UserNameException e) {
e.printStackTrace();
} catch (PasswordException e) {
e.printStackTrace();
}
}
}
以上是一起分析Java中異常的產生原因及處理的詳細內容。更多資訊請關注PHP中文網其他相關文章!