今天在公司和同事聊天的时候,突然发现自己对java中的throw、throws和try catch的作用理解不够准确,在网上查了查,在此大概梳理一下。

throw用于抛出异常,例如

throw new NullPointerException();

就是抛出一个空指针异常。异常抛出后程序终止,除非用try catch包围起来,会在执行完catch和finally块中的代码后,继续执行之后的代码。这也是try catch的一个作用,即防止程序崩溃。

throws用于声明一个方法可能抛出某种异常,提醒调用者处理。例如

void test() throws NullPointerException {

}

意思是这个test方法可能会抛出空指针异常,调用者可能需要处理。为什么说可能需要处理,因为有些异常不处理也可通过编译,有些则不行。需要处理的异常为非运行时异常,如IOException、SQLException和自定义Exception;不需要处理的异常为运行时异常,如NullPointerException、IndexOutOfBoundsException等。前者必须try catch处理,否则无法通过编译,后者则不需要。

对于运行时异常,虽然编译器不强制要求处理,但是在不处理的情况下,异常会一直向上抛出,直至最上层为止。多线程最后会由Thread.run()抛出,单线程则由main()抛出,然后程序终止。

try catch就是处理异常的方式。需要明确的一点是,即便没有try catch(准确说是没有catch块中的e.printStackTrace()或别的打印异常信息语句),控制台还是会打印异常的堆栈信息。反而如果有try catch,但是catch块中没有打印异常信息的话,控制台中就会空空如也。这也是许多规范中严禁catch块中什么都不做的原因,至少应该在日志中记录异常信息,因为try catch相当于接管了java本身的异常处理,虽然这使得我们可以在发生异常时做很多事,但我们若是什么都不做的话,java也不会重新接管。

java中的throw、throws和try catch浅析的更多相关文章

  1. java异常处理之throw, throws,try和catch

    转自 http://blog.csdn.net/zhouyong80/article/details/1907799  程序运行过程中可能会出现异常情况,比如被0除.对负数计算平方根等,还有可能会出现 ...

  2. Java中的throw和throws的差别

    Java中的throw和throws的差别 1.throwkeyword用于方法体内部.而throwskeyword用于方法体部的方法声明部分: 2.throw用来抛出一个Throwable类型的异常 ...

  3. Java中的throw和throws的区别

    Java中的throw和throws的区别 1.throw关键字用于方法体内部,而throws关键字用于方法体部的方法声明部分: 2.throw用来抛出一个Throwable类型的异常,而throws ...

  4. Java牛角尖【007】:Java中的Error能不能被Catch

      Java牛角尖[007]:Java中的Error能不能被Catch 网上看到很多朋友说Java中Error是无法Catch到的,而Java中定义的Error类型又很难测试到,那就估且以为确是如此吧 ...

  5. java中的throw与throws的区别

    什么时运行时异常?什么是非运行时异常? 通俗的讲: 运行时异常:就是编译通过,运行时就崩了,比如数组越界. 非运行时异常:就是编译不通过,这时就得必须去处理了.不然就没法运行了. 全面的讲: Thro ...

  6. java中的抛出异常throws与throw

    throws与throw throws是方法可能抛出异常的声明.(用在声明方法时,表示该方法可能要抛出异常)语法:[(修饰符)](返回值类型)(方法名)([参数列表])[throws(异常类)]{.. ...

  7. 【Java】异常 —— throw, throws, try catch 相关内容

    嗯……面试考到了这个,又是一个如无意外 那么接下来就总结吧 一.什么是异常 程序运行过程中发生的异常事件. RuntimeException通常是因为编程员因为疏忽没有检查而引起的错误. 二.Exce ...

  8. Java 中,throw 和 throws 有什么区别?

    throw 用于抛出 java.lang.Throwable 类的一个实例化对象,意思是说你可以通 过关键字 throw 抛出一个 Error 或者 一个 Exception,如:throw new ...

  9. Java中String和byte[]间的转换浅析

    Java语言中字符串类型和字节数组类型相互之间的转换经常发生,网上的分析及代码也比较多,本文将分析总结常规的byte[]和String间的转换以及十六进制String和byte[]间相互转换的原理及实 ...

随机推荐

  1. LeetCode - X of a Kind in a Deck of Cards

    In a deck of cards, each card has an integer written on it. Return true if and only if you can choos ...

  2. python 连接 oracle 统计指定表格所有字段的缺失值数

      python连接oracle -- qlalchemy import cx_Oracle as co import pandas as pd from sqlalchemy import crea ...

  3. Linux中“零拷贝”

    服务器响应一个http请求的步骤 把磁盘文件读入内核缓冲区 从内核缓冲区读到内存 处理(静态资源不需处理) 发送到网卡的内核缓冲区(发送缓存) 网卡发送数据 数据从第一步中的内核缓冲区到第四步的内核缓 ...

  4. Python shutil 模块

    高级的文件.文件夹.压缩包 处理模块 http://www.cnblogs.com/wupeiqi/articles/4963027.html

  5. Spark Streaming 'numRecords must not be negative'问题解决

    转载自:http://blog.csdn.net/xueba207/article/details/51135423 问题描述 笔者使用spark streaming读取Kakfa中的数据,做进一步处 ...

  6. Python模块 os和sys

    os模块是与操作系统交互的一个接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相 ...

  7. NPOI导出excel(2.0.6版本)

    public static void WriteExcel(System.Data.DataTable dt,string fileName) { NPOI.XSSF.UserModel.XSSFWo ...

  8. Properties类学习笔记

    1.Properties是一个hashTable子类,但它只装String类型的值2.一个Properties集中有一个子Properties集为它的默认属性集,如果在Properties中找不到相关 ...

  9. 算法实践--最长公共子序列(Longest Common Subsquence)

    什么是最长公共子序列 X=ACCG Y=CCAGCA 长度为1的公共子序列: {A} {C} {G} 长度为2的公共子序列:{AC} {CC} {CG} {AG} 长度为3的公共子序列:{ACG} 长 ...

  10. autofac中文文档

    https://autofaccn.readthedocs.io/zh/latest/index.html