什么是异常?

不正常的,会影响程序的正常执行流程。

例如下面的程序

public static void main(String[] args) {
TestDemo1 t = new TestDemo1();
t.a();
System.out.println("其它程序代码");
}
public void a() {
b();
}
public void b() {
int x =;
int y = ;
int z = x / y;
System.out.println("结果是:"+z);
}

Error:错误

JVM自身的错误,程序员不能处理。

Exception:异常

受检异常(非运行时异常)

程序员必须进行异常处理,否则编译通不过

运行时异常

RuntimeException类和它的子类。

程序员可以不做处理。改代码。

也可以处理,处理了程序可以不中断。

异常处理机制

Java的异常处理是通过5个关键字来实现的:try、catch、finally、throw和throws。

try...catch基本语法

可以添加多个catch

public void method() {
try {
//代码段(此处可能会产生异常)
}catch(异常类型 ex) {
//对异常进行处理的代码段
}
//代码段
}

try...catch三种情况

1.没有引发异常,不执行catch块

2.异常类型匹配,可以处理,程序不会中断,执行catch块,其他代码正常执行

3.异常类型不匹配,程序中断,不执行catch块

try...catch...catch...

public void method() {
try {
//代码段(此处可能会产生异常)
}catch(异常类型 ex1) {
//对异常进行处理的代码段
}catch(异常类型 ex2) {
//对异常进行处理的代码段
}
//代码段
}

多重catch块的好处

对不同的异常,进行不同的处理

为了避免漏掉异常,在最后catch块中使用Exception父类。

但是,遵循规则:

1.先子类后父类。

2.先普通后特殊。

try...catch...catch...finally...

保证一些资源释放的代码一定会执行

public void method() {
try {
//代码段(此处可能会产生异常)
}catch(异常类型 ex1) {
//对异常进行处理的代码段
}catch(异常类型 ex2) {
//对异常进行处理的代码段
}finally{
//此代码块一定会执行,无论是否引发异常
System.out.println("此代码块一定会执行");
}
//代码段
}
 public class TestException2 {

     public void showArr() {
Scanner input = new Scanner(System.in);
int [] arr = new int[];
System.out.println("赋值:");
try {
for(int i = ; i < arr.length; i++) {
arr[i] = input.nextInt();
}
Arrays.stream(arr).forEach(System.out::println);
} catch (InputMismatchException e) {
System.out.println("赋值出错了");
e.printStackTrace();
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("赋值出错了");
e.printStackTrace();
} catch (Exception e) {
System.out.println("赋值出错了");
e.printStackTrace();
} finally {
input.close();//释放资源
System.out.println("程序运行结束");
}
}
public static void main(String[] args) {
new TestException2().showArr(); } }

throws

声明异常,是把异常抛给了调用者。

调用者处理方式

1.try - catch 建议使用

2.throws

throws 运行时异常:调用者可不做处理。

 class Demo{
public void div() throws RuntimeException{
//我不想处理
//处理不了
Scanner input = new Scanner(System.in);
System.out.println("输入数字");
int n1 = input.nextInt();
int n2 = input.nextInt();
int n3 = n1 / n2;
System.out.println(n3);
}
}
public class TestException3 {
// 2.继续 throws 向上抛出 throws Exception
public static void main(String[] args){
Demo demo = new Demo();
//调用者
//(1)处理了 用try - catch
/* try {
demo.div();
} catch (Exception e) {
e.printStackTrace();
}*/
demo.div(); } }

throw

自定义异常

定义类继承自系统异常父类

 class AgeException extends Exception{
String str;
AgeException(String str){
// this.str = str;
super(str);
}
@Override
public String getMessage() {
return "Message:年龄必须是 0 - 150";
}
@Override
public String toString() {
return "String:年龄必须是 0 - 150";
}
@Override
public void printStackTrace() {
System.out.println("stack:年龄必须是 0 - 150");
}
}
class Employee{
private int age;
private String sex;//男 和 女 Gender public String getSex() {
return sex;
}
public void setSex(String sex) throws Exception{
if(sex.equals("男") || sex.equals("女")) {
this.sex = sex;
}else {
throw new Exception("性别必须是男 和女");
} }
public int getAge() {
return age;
}
/* public void setAge(int age) throws Exception{
if(age >= 0 && age <= 150) {
this.age = age;
}else {
//抛异常
throw new Exception("年龄必须在 0 - 150之间");
}
}*/
public void setAge(int age) throws AgeException{
if(age >= && age <= ) {
this.age = age;
}else {
//抛异常 运行时异常
throw new AgeException("年龄必须在 0 - 150之间");
}
}
}
public class TestEmployee { public static void main(String[] args) { try {
new Employee().setAge(); } catch (AgeException e) { // e.printStackTrace();
// System.out.println(e);
System.out.println(e.getMessage());
}
} }

异常处理的原则

1.异常用于处理不正常的情况

2.尽量避免用过大的try块

3.尽量用多重catch块,对不同的异常进行不同的处理

4.尽量处理异常,不要避免异常

5.最好在@throws中标出异常类型

Day12 Java异常处理与程序调试的更多相关文章

  1. 零基础学Python--------第9章 异常处理及程序调试

    第9章 异常处理及程序调试 9.1 异常概述 在程序运行过程中,经常会遇到各种各样的错误,这些错误统称为“异常”.这些异常有的是由于开发者将关键字敲错导致的,这类错误多数产生的是SyntaxError ...

  2. 笔记:Python异常处理与程序调试

    Python异常处理与程序调试 Python提供了强大的异常处理机制,通过捕获异常可以提高程序的健壮性.异常处理还具有释放对象,中止循环的运行等作用.在程序运行的过程中,如果发生了错误,可以返回事先约 ...

  3. python:异常处理及程序调试

    1.异常概述 在程序运行过程中,经常会遇到各种各样的错误.这些错误统称为“异常”,在这些一场中有的是由于开发者将关键词写错导致,这类错误产生的是SyntaxError.invalid syntax(无 ...

  4. Java开发工具与程序调试

    开发工具:MyEclipse,Eclipse等. 程序调试:  (1)断点:设置断点是程序调试中必不可少的手段,Java调试器每次遇到程序断点时都会将当前线程挂起,即暂停当前程序的运行.(在Eclip ...

  5. [Python学习笔记][第八章Python异常处理结构与程序调试]

    1/30 第八章Python异常处理结构与程序调试 异常处理 try-except结构 try: try块 except Exception: except块 try-except-else结构 tr ...

  6. tomcat+java的web程序持续占cpu高问题调试【转】

    转自 tomcat+java的web程序持续占cpu问题调试 - 像风一样的自由 - CSDN博客http://blog.csdn.net/five3/article/details/28416771 ...

  7. Java异常处理:如何写出“正确”但被编译器认为有语法错误的程序

    文章的标题看似自相矛盾,然而我在"正确"二字上打了引号.我们来看一个例子,关于Java异常处理(Exception Handling)的一些知识点. 看下面这段程序.方法pleas ...

  8. 052 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 14 Eclipse下程序调试——debug2 多断点调试程序

    052 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 14 Eclipse下程序调试--debug2 多断点调试程序 本文知识点: Eclipse下程序调 ...

  9. 051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

    051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试--debug入门1 本文知识点: 程序调试--debug入门1 程序 ...

随机推荐

  1. 撩课-Web大前端每天5道面试题-Day18

    1.如何判断一个变量是对象还是数组? 判断数组和对象分别都有好几种方法,其中用prototype.toString.call()兼容性最好. function isObjArr(variable){ ...

  2. java设计模式-----16、解释器模式

    概念: Interpreter模式也叫解释器模式,是行为模式之一,它是一种特殊的设计模式,它建立一个解释器,对于特定的计算机程序设计语言,用来解释预先定义的文法.简单地说,Interpreter模式是 ...

  3. PHP生成缩略图(3)--封装类

    前台php代码 <?php require_once 'img_thumb.class.php'; $image = new ImgLib(); //源图路径 $src_path='E:/wam ...

  4. CCIE

    400-251:    CCIE  Security Written

  5. ENVI对一种WGS84投影不支持的情况说明

    作者:朱金灿 来源:http://blog.csdn.net/clever101 假如wkt字符串这样描述WGS84投影: GEOGCS["GCS_WGS_1984",DATUM[ ...

  6. 如何从本地添加项目到Github?(Windows)

    有两种方法可以上传项目到Github 一.github在线上传文件夹 在线上传也可以上传完整的文件夹结构,直接拖拽到上传文件页面的框中即可. 点击上传文件 直接拖拽即可上传文件夹及文件夹里面的文件.如 ...

  7. 网鼎杯 pwn 记录

    题目位置 https://gitee.com/hac425/blog_data/tree/master/wdb babyheap 通过分配和释放构建 2 个 fastbin 链 利用 show 功能, ...

  8. CSS 内外边距 float positio属性

    一.外边距和内边 margin:            用于控制元素与元素之间的距离 外边距:margin的最基本用途就是控制元素周围空间的间隔,从视觉角度上达到相互隔开的目的. padding:   ...

  9. 关于removeChild

    var a=document.body; document.body.parentNode.removeChild(a) console.log(a); a的内容还是body???whY

  10. Sql Server tempdb原理-启动过程解析实践

    我们知道在SqlServer实例启动过程中数据库会进行还原(Redo,Undo)然后打开提供服务,但我们知道tempdb是不提供重做机制的(Redo)那tempdb是如何还原的呢?如果tempdb损坏 ...