java--异常

异常

异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。在Java中,根据错误性质将运行错误分为两大类错误异常

Java中的所有异常都是由Throwable类的子类生成的对象,所有的异常类都是Throwable类的子类或子类的子类。Throwable类是Object类的直接子类,Error类和Exception类是Throwable类的两个直接子类。

要理解Java异常处理是如何工作的,你需要掌握以下几种类型的异常:

检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。所谓检查(Checked)是指编译器要检查这类异常,检查的目的一方面是因为该类异常的发生难以避免,另一方面就是让开发者去解决掉这类异常,所以称为必须处理(try …catch)的异常。如果不处理这类异常,集成开发环境中的编译器一般会给出错误提示。

当函数中存在抛出检查型异常的操作时该函数的函数声明中必须包含throws语句。调用改函数的函数也必须对该异常进行处理,如不进行处理则必须在调用函数上声明throws语句。
在Java中所有不是RuntimeException派生的Exception都是检查型异常

例如:
IOException、FileNotFoundException(文件找不到异常)
文件找不到异常,如果文件不存在就会抛出这种异常。
IO,即:input, output,我们在读写磁盘文件、网络内容的时候经常会生的一种异常,这种异常是受检查异常,需要进行手工捕获
如定义输入输出文件流,文件不存在会报错:

如文件读写会抛出 以上异常:

public int read() throws IOException

public void write(int b) throws IOException

public FileInputStream(File file) throws FileNotFoundException

public FileOutputStream(File file) throws FileNotFoundException

FileNotFoundException 其实是 IOException 的子类,同样是受检查异常,需要进行手工捕获。

SQLException(SQL异常)
SQL异常,发生在操作数据库时的异常。
连接数据库示范代码:

public Connection getConnection() throws SQLException {
if (getUser() == null) {
return DriverManager.getConnection(url);

} else {
return DriverManager.getConnection(url, getUser(), getPassword());

}

}

又或者是获取下一条记录:

boolean next() throws SQLException;

ClassNotFoundException(类找不到异常)
类找不到异常,在加载类的时候抛出,即在类路径下不能加载指定的类。

代码示例:

public staticClassgetExistingClass(ClassLoader classLoader, String className) {
try {
return (Class) Class.forName(className, true, classLoader);

}

catch (ClassNotFoundException e) {
return null;

}

}

NoSuchMethodException(方法不存在异常)

一般发生在反射调用方法的时候,如:

public Method getMethod(String name, Class... parameterTypes)

throws NoSuchMethodException, SecurityException {
checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);

Method method = getMethod0(name, parameterTypes, true);

if (method == null) {
throw new NoSuchMethodException(getName() + . + name + argumentTypesToString(parameterTypes));

}

return method;

}

异常处理方式

1、继续抛出,消极的方法,一直可以抛到java虚拟机来处理;

2、用try…catch捕获

非检查性异常也叫RuntimeException(运行时异常)。所谓非检查(Unchecked)是指编译器不会检查这类异常,不检查的代码则表示是开发者在代码的编辑编译阶段就不是必须要处理的,这类异常一般可以避免,因此无需处理(try …catch)。如果不处理这类异常,集成开发环境中的编译器也不会给出错误提示。

与检查型异常对比,非检查型异常可以不在函数声明中添加throws语句,调用函数上也不需要强制处理。可以不使用try…catch进行处理,但是如果有异常产生,则异常将由JVM进行处理。对于RuntimeException的子类最好也使用异常处理机制。虽然RuntimeException的异常可以不使用try…catch进行处理,但是如果一旦发生异常,则肯定会导致程序中断执行,所以,为了保证程序再出错后依然可以执行,在开发代码时最好使用try…catch的异常处理机制进行处理。

例如:
ClassCastException(类转换异常)
类转换异常,将一个不是该类的实例转换成这个类就会抛出这个异常。
如将一个数字强制转换成字符串就会报这个异常:
Object x = new Integer(0);

System.out.println((String)x);

NullPointException(访问null空对象)
空指针异常,操作一个 null 对象的方法或属性时会抛出这个异常

OutOfMemoryError(内存异常异常)
内存异常异常,这不是程序能控制的,是指要分配的对象的内存超出了当前最大的堆内存,需要调整堆内存大小(-Xmx)以及优化程序。

ArithmeticException

算术异常,发生在数字的算术运算时的异常,如一个数字除以 0 就会报这个错。

异常处理方式
1、捕获;

2、继续抛出;

3、不处理。

错误: 错误不是异常,而是脱离程序员控制的问题。类包括一些严重的程序不能处理的系统错误类,如内存溢出、虚拟机错误、栈溢出等。这类错误一般与硬件有关,与程序本身无关,通常由系统进行处理,程序本身无法捕获和处理,错误在代码中通常被忽略。

常见的error有:
NotClassDeFountError(类未定义错误)
如果JVM或者Classloader实例尝试加载类(或者new创建对象)却找不到类的定义,要查找的类在编译时期是存在,运行期间却找不到该对象对应的类,这个时候就会导致NoClassDeFoundError错误。可能是自己不小心改了依赖类名字,也可以试试System.getproperty(”java.classpath“)方法,查看实际存在的运行期间的classpath。

OutofMemoryError(内存溢出错误)
内存溢出错误,这不是程序能控制的,是指要分配的对象的内存超出了当前最大的堆内存,需要调整堆内存大小(-Xmx)以及优化程序

StackOverFlowError(栈溢出错误)
当栈深度超过虚拟机分配给线程的栈大小时就会出现此error。

public class StackOverFlow {
    private int i;

    public void plus() {
        i++;
        plus();
    }

    public static void main(String[] args) {
        StackOverFlow stackOverFlow = new StackOverFlow();
        try {
            stackOverFlow.plus();
        } catch (Error e) {
            System.out.println("Error:stack length:" + stackOverFlow.i);
            e.printStackTrace();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Janthrven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值