Java学习之路(十)异常处理

it2022-05-05  147

一、异常和错误

错误:在我们编写程序的过程中会经常发生的,包括编译期间和运行期间的错误。

异常:在程序运行过程中,意外发生的情况,背离我们程序本身的意图的表现,都可以理解为异常。

二、异常分类

Throwable(异常顶层) Error(错误):程序无法处理的错误,表示运行应用程序中较严重的问题。Exception(异常):程序本身可以处理的异常。异常处理通常指针对这种类型异常的处理。 Unchecked Exception:非检查异常Checked Exception:检查异常

三、异常处理

通过五个关键字来实现:try、catch、finally、throw(手动抛出异常,通常配合try catch或throws使用)、throws

(一)try…catch…

try{ // 执行后可能产生异常的代码 } catch (/*异常捕捉*/){ // 异常处理 } finally{ // 不论是否发生异常,都会执行的代码 }

案例如下:

public class TestMain { public void compute() { int x = 10, y = 0; double z = 0; try { z = x / y; System.out.println(z); } catch (ArithmeticException e) { System.out.println("除数不得为0"); } catch (Exception e) { // 通常会在最后加上这个,来处理可能被遗漏的异常 e.printStackTrace(); } } public static void main(String[] args) { TestMain testMain = new TestMain(); testMain.compute(); } }

(二)throws

public void method() throws 异常类型{ // 执行后可能产生异常的代码 }

案例如下

public class TestMain { public void compute2() throws ArithmeticException{ int x = 10, y = 0; double z = 0; z = x / y; System.out.println(z); } public static void main(String[] args) { TestMain testMain = new TestMain(); try { testMain.compute2(); } catch (Exception e) { System.out.println("除数不得为0"); } } }

(三)throw

配合try…catch…

public class TestMain { public void compute3() { int x = 10, y = 0; double z = 0; try { if (y == 0) { throw new Exception("除数不能为0"); }else { z = x / y; System.out.println(z); } } catch (ArithmeticException e) { System.out.println("除数不得为00"); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { TestMain testMain = new TestMain(); testMain.compute3(); } } /* 抛出异常: java.lang.Exception: 除数不能为0 */

配合throws

public class TestMain { public void compute4() throws Exception{ int x = 10, y = 0; double z = 0; if (y == 0) { throw new Exception("除数不能为0"); }else { z = x / y; System.out.println(z); } } public static void main(String[] args) { TestMain testMain = new TestMain(); try { testMain.compute4(); } catch (Exception e) { System.out.println("除数不得为0"); } } } /* 运行结果: 除数不得为0 */

四、自定义异常

取用上面的案例

public class DivException extends Exception { public DivException() { super("除数不得为0"); } } public class TestMain { // throw与try catch public void compute3() { int x = 10, y = 0; double z = 0; try { if (y == 0) { throw new DivException(); // 抛出自定义异常 }else { z = x / y; System.out.println(z); } } catch (ArithmeticException e) { System.out.println("除数不得为00"); } catch (Exception e) { e.printStackTrace(); } } public void compute4() throws Exception{ int x = 10, y = 0; double z = 0; if (y == 0) { throw new DivException(); // 抛出自定义异常 }else { z = x / y; System.out.println(z); } } // throw与throws搭配 public static void main(String[] args) { TestMain testMain = new TestMain(); testMain.compute3(); try { testMain.compute4(); } catch (Exception e) { System.out.println("除数不得为0"); } } }

五、异常链

异常链:将异常发生的原因一个传一个串起来,即将底层异常信息传给上层,这样逐层抛出。

public class TestMain { public void compute() throws DivException{ int x = 10, y = 0; double z = 0; try { z = x / y; System.out.println(z); } catch (ArithmeticException e) { throw new DivException(); } } public void testExcept1() throws Exception{ try { compute(); } catch (Exception e) { throw new Exception("新异常1", e); } } public void testExcept2() throws Exception{ try { testExcept1(); } catch (Exception e) { throw new Exception("新异常2", e); } } public static void main(String[] args) { TestMain testMain = new TestMain(); try { testMain.testExcept2(); } catch (Exception e) { e.printStackTrace(); } } }

运行结果:

如果将代码中的y = 0改成y = 2,则运行结果为5.0。


最新回复(0)