代码在运行中发生的问题就是异常

java中把多种异常封装多个类,当程序出现问题时候,就会创建异常类对象并且抛出相关信息

异常体系:

Throwable类是Java中所有错误或异常的父类

Throwable的子类Error类是所有错误的父类

Throwable的另一个子类Exception类是所有异常的父类

在开发中,相对来说,我们并不关心错误,而更关心异常

异常和错误的区别(通俗解释):

异常:相当于一个人感冒了,吃药睡觉等进行相应的操作即可痊愈,不修改代码处理掉异常,程序还可以执行

错误:相当于一个人得了绝症,无法治愈,必须修改代码,程序才可以执行

所以可以这样理解:我们并不关心患了绝症的人,而会想方法去治愈得了小病的人

示例:‘

package demo;

public class Demo {
public static void main(String[] args) {
function1();
function2();
}
public static void function1(){
//异常
int[] arr = {1,2};
System.out.println(arr[3]);
//输出:
//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
//at demo.Demo.function1(Demo.java:11)
//at demo.Demo.main(Demo.java:5)
}
public static void function2(){
//错误
int[] arr = new int[666666666];
System.out.println(arr);
//输出:
//Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
//at demo.Demo.function2(Demo.java:19)
//at demo.Demo.main(Demo.java:6)
}
}

一旦异常被抛出了,后边的程序都不会执行,因此要想办法解决这个问题

异常中的关键字throw:

写一段代码,存在空指针异常

package demo;

public class ExceptionDemo {
public static void main(String[] args) {
int [] arr = null;
function(arr);
}
public static int function(int[] arr){
int i = arr[arr.length-1];
return i;
}
}

加入throw关键字,抛出异常:

package demo;

public class ExceptionDemo {
public static void main(String[] args) throws Exception {
int [] arr = null;
int i = function(arr);
System.out.println(i);
}
public static int function(int[] arr) throws Exception{
//如果方法中有异常,需要在方法上声明:throws Exception
//抛出的类型和声明的异常类应当一致
//main调用这个方法,也需要加入声明
if(arr == null){
//抛出异常,告诉调用者
//手动抛出异常
throw new Exception("传递数组不存在");
}
if(arr.length == 0){
throw new Exception("传递的数组中没有元素");
}
int i = arr[arr.length-1];
return i;
}
}
/*
输出:
Exception in thread "main" java.lang.Exception: 传递数组不存在
at demo.ExceptionDemo.function(ExceptionDemo.java:16)
at demo.ExceptionDemo.main(ExceptionDemo.java:6)
*/

这里注意,如果是运行时异常(RuntimeException),不需要throws声明 ,

而且如果发生这种异常,那么必须改代码,否则代码无意义

try  catch方法异常处理:

package demo;

public class ExceptionDemo {
public static void main(String[] args) {
int[] arr = null;
try {
int i = function(arr);
System.out.println(i);
} catch (NullPointerException ex) {
System.out.println(ex);
} catch (ArrayIndexOutOfBoundsException ex) {
System.out.println(ex);
}
System.out.println("结束");
} public static int function(int[] arr) throws NullPointerException, ArrayIndexOutOfBoundsException {
if (arr == null) {
// 手动抛出空指针异常
throw new NullPointerException("数组不存在");
}
if (arr.length < 6) {
// 手动抛出数组索引越界异常
throw new ArrayIndexOutOfBoundsException("数组没有6索引");
}
return arr[6];
}
}
/*
输出:
java.lang.NullPointerException: 数组不存在
结束
*/

这里发现,虽然程序有异常,但是依然执行后面的代码,这就是异常处理

catch的顺序:

平级:

package demo;/*
* catch处理的注意事项:
* 有顺序
* 当异常是平级的时候,即没有继承关系的时候,没有顺序限制
*/
public class ExceptionDemo {
public static void main(String[] args) {
try { } catch (NullPointerException e) { } catch (ArrayIndexOutOfBoundsException e) { }
}
}

有继承关系:

package demo;
//有继承关系:越高级的写在越靠后
public class ExceptionDemo {
public static void main(String[] args) {
try { } catch (NullPointerException ex) { } catch (RuntimeException ex) { } catch (Exception ex){ }
}
}

finally:

package demo;

//finally:必须执行
//是否有异常都会执行
public class ExceptionDemo {
public static void main(String[] args) {
try {
function(1);
} catch (Exception ex) {
System.out.println(ex);
} finally {
System.out.println("代码必须执行");
}
} public static void function(int a) throws Exception {
if (a == 0) {
throw new Exception();
}
System.out.println(a);
}
}
//无论传入什么,都会输出:代码必须执行

注意事项:

1.父类的方法如果抛出异常,子类重写后可以不抛出异常,但是子类如果要抛出异常,这个异常的继承关系不能大于父类的异常

自定义异常:

有时候需要一些自定义的异常,这里做一个示例:

package demo;

public class FuShuException extends RuntimeException {
public FuShuException(String string){
super(string);
}
public FuShuException(){}
}
package demo;

//设置一个情景,计算两门成绩的平均数,不能为负数
//如果是一个负数,就抛出异常
public class ExceptionDeno {
public static void main(String[] args) throws FuShuException {
try {
int i = function(10, 97);
System.out.println(i);
} catch (FuShuException ex) {
ex.printStackTrace();
}
} public static int function(int a, int b) throws FuShuException {
if (a < 0 || b < 0) {
throw new FuShuException("成绩不为负");
}
int sum = a + b;
return sum / 2;
}
}

Java学习笔记35(异常)的更多相关文章

  1. 1.13(java学习笔记)异常机制

    异常不同于错误,它是程序运行时产生的未知问题. 如果把程序比喻成一辆汽车,那么汽车开着开着突然前面出现了一个大石头挡住了路,这就叫异常. 那么出现了这个异常我们需要去处理,比如打电话给公路管理局,让它 ...

  2. 【原】Java学习笔记030 - 异常

    package cn.temptation; public class Sample01 { public static void main(String[] args) { /* * 异常:Java ...

  3. Java学习笔记__异常机制_try_catch_finally_return执行顺序

    package cn.xiaocangtian.Exception; import java.io.FileInputStream; import java.io.FileNotFoundExcept ...

  4. Java 学习笔记之 异常法停止线程

    异常法停止线程: public class RealInterruptThread extends Thread { @Override public void run() { try { for ( ...

  5. Java学习笔记35(sql补充)

    在上一篇里,写了数据库的增删该查,没有写完,这里补充 CREATE DATABASE Zs_Base; USE Zs_Base; # 创建表 CREATE TABLE PRODUCT( ID INT ...

  6. JAVA学习笔记—review基本知识[反射与异常]

    JAVA学习笔记—review基本知识[反射与异常] 1.异常: 1.1异常的分类: Java会将所有的异常封装成对象,其根本父类为Throwable. Throwable有两个子类:Error 和E ...

  7. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  8. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  9. java学习笔记09--反射机制

    java学习笔记09--反射机制 什么是反射: 反射是java语言的一个特性,它允许程序在运行时来进行自我检查并且对内部的成员进行操作.例如它允许一个java的类获取他所有的成员变量和方法并且显示出来 ...

随机推荐

  1. 使用jQuery+huandlebars防止编码注入攻击

    兼容ie8(很实用,复制过来,仅供技术参考,更详细内容请看源地址:http://www.cnblogs.com/iyangyuan/archive/2013/12/12/3471227.html) & ...

  2. SVG绘制太极图

    思路:先画一整个圆,填充颜色为黑色,再用一个边框和填充颜色均为白色的长方形覆盖右半边的半圆,再以同一个圆心,相同半径绘制一整个圆,该圆的边线颜色为黑色,没有填充颜色,最后常规操作再画四个小圆 源代码: ...

  3. php RSA非对称加密 的实现

    基本概念 加密的意义 加密的意义在于数据的传输过程中,即使被第三方获取到传输的数据,第三方也不能获取到数据的具体含义. 加密方式分为对称加密和非对称加密 什么是对称加密? 对称加密只使用一个秘钥,加密 ...

  4. Python自动化测试用例设计--测试类型

    1.前言 WEB自动化测试时候测试哪些类型,下面将介绍一下: 2. 测试类型 2.1 测试静态内容 静态内容测试是最简单的测试,用于验证静态的.不变化的UI 元素的存在性.例如: 每个页面都有其预期的 ...

  5. WordPress 自动初始化数据库

    背景 自动化搭建开发环境.测试.部署如通过网页操作(访问 /wp-admin/install.php)相对比较麻烦且在有的场景无法实现. 步骤 修改 wp-config.php 配置 wordpres ...

  6. 搭建Fabric网络(三)artifacts是怎么生成的:cryptogen和configtxgen

    在first-network里,./byfn.sh generate可以生成artifacts文件. generate参数其实是使用了cryptogen和configtxgen这两个工具,这两个工具分 ...

  7. HDU 6214.Smallest Minimum Cut 最少边数最小割

    Smallest Minimum Cut Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Oth ...

  8. idea环境配置

    Idea 下载 https://www.jetbrains.com/idea/download/#section=windows idea安装(略) idea破解 window配置hosts文件:0. ...

  9. STL基础4:deque

    #include <iostream> #include <queue> #include <string> using namespace std; #defin ...

  10. Django的学习进阶(二)———— name

    一.问题: 在做完第一个demo的时候,由于只是基础学习,所以对于name的使用并不需要很熟练,也不用理解的很深.但是在做音乐网站的时候遇到了关于如何使用name的内容. 由于一个app中会使用到另一 ...