首页 文章 精选 留言 我的

精选列表

搜索[提高],共10006篇文章
优秀的个人博客,低调大师

【Java入门提高篇】Day17 Java异常处理(下)

今天继续讲解java中的异常处理机制,主要介绍Exception家族的主要成员,自定义异常,以及异常处理的正确姿势。 Exception家族 一图胜千言,先来看一张图。 Exception这是一个父类,它有两个儿子,IOException和RuntimeException,每个儿子都很能生,所以它有着一堆的孙子,但其实,Exception家族还有一个大家伙,那就是Throwable,这是一个接口,看名字就知道意思,就是“可被抛出”嘛,它还有一个同父异母的哥哥,那就是Error,这家伙可厉害了,Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。catch语句里,不仅可以catch住Exception,还能catch住Error(什么?你真的打算catchError??程独秀同学,你先坐下。)一般情况下,是不能捕获Error的,对于这类错误,Java编译器不去检查他们。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止。除非你有把握能正确处理,否则程独秀同学还是坐下吧(滑稽)。 UncheckedException和CheckedException 你也许会一脸懵逼,???,这是啥?异常也是分派别的,Unchecked Exception表示“未检查异常“,CheckedException自然就是”已检查异常“,派生于Error或者RuntimeException的异常称为unchecked异常,所有其他的异常成为checked异常。那问题来了,为啥要区分这两种异常? 我们可以再看看上面那个图,可以看出,RuntimeException和Error都是由程序内部引发的错误,比如上一篇里所说的空指针和算术异常。而CheckedException则大都是由外部因素导致的,如文件无法找到异常,这是虚拟机无法掌控的情况,当出现异常,虚拟机也只能一脸懵逼,不知道该如何是好,所以当有可能发生时,就必须要使用try..catch去捕获它,而对于Unchecked Exception时,大部分是由于代码引发的,所以只要代码写的足够完善,是不会抛出这样的异常的,所以也不强制要求捕获。 所以原因其实很简单,编译器将检查你是否为所有的已检查异常提供了异常处理机制,比如说我们使用Class.forName()来查找给定的字符串的class对象的时候,如果没有为这个方法提供异常处理,编译是无法通过的。已检查异常的意义就在于让你知道,这地方是有可能抛异常的,你要注意了,赶紧捕获了。 自定义异常 那么如何自定义一个异常呢?其实很简单,只需要继承Exception类就好了。看下面的栗子: public class MyException extends Exception { public MyException() { super(); } public MyException(String message) { super(message); } public MyException(String message, Throwable cause) { super(message, cause); } public MyException(Throwable cause) { super(cause); } protected MyException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); } } MyException继承了Exception类,重写了构造函数,并没有加自己的逻辑,只是调用了父类的方法。你看,自定义一个异常其实很简单吧。看到这你也许又疑惑了,这尼玛好像就是给Exception换了个名字,有啥用??? 别急,别急,你忘了吗,Exception不仅是可以捕获的,还是可以主动抛出的,所以当遇到某些特定的情况时,我们就可以主动抛出异常,然后在调用时去捕获它,获取异常信息,如果直接用Exception的话,那么捕获的时候,会把所有的异常,该捕获不该捕获的都一起捕获了,那么就没法区分哪些是我们主动抛出来的异常了,这样就无法对那些异常进行特殊处理了。 异常处理的正确姿势 接下来要简单介绍一个实际使用中常用的异常处理方法——异常链化处理。 在一些大型的,模块化的软件开发中,一旦一个地方发生异常,则如骨牌效应一样,将导致出现一连串的异常。假设B模块需要调用A模块的方法,如果A模块发生异常,则B也将不能完成而发生异常,但是B在抛出异常时,会将A的异常信息掩盖掉,这将使得异常的根源信息丢失。而使用异常的链化可以将多个模块的异常串联起来,使得异常信息不会丢失。 异常链化就是用一个异常对象为参数构造新的异常对象。新的异对象将包含先前异常的信息。这项技术主要是异常类的一个带Throwable参数的函数来实现的。这个当做参数的异常,我们叫他根源异常(cause)。如果你细心一点的话,会发现上面的栗子里也有一个叫做cause的东西,没错,说的其实就是它,在new一个新的异常时,将之前的异常信息传入构造函数即可。下面再用一个简单的栗子进行说明: public class Test { public static void main(String[] args) { System.out.println("请输入2个加数"); int result; try { result = add(); System.out.println("结果:"+result); } catch (Exception e){ e.printStackTrace(); } } /** * 执行加法计算 */ private static int add() throws Exception { int result; try { List<Integer> nums =getInputNumbers(); result = nums.get(0) + nums.get(1); }catch(InputMismatchException immExp){ //链化:以一个异常对象为参数构造新的异常对象。 throw new Exception("计算失败",immExp); } return result; } /** * 获取输入的整数 */ private static List<Integer> getInputNumbers() { List<Integer> nums = new ArrayList<>(); Scanner scan = new Scanner(System.in); try { int num1 = scan.nextInt(); int num2 = scan.nextInt(); nums.add(new Integer(num1)); nums.add(new Integer(num2)); }catch(InputMismatchException immExp){ throw immExp; }finally { scan.close(); } return nums; } } 输出如下: 请输入2个加数 d d java.lang.Exception: 计算失败 at com.frank.chapter17.Test.add(Test.java:35) at com.frank.chapter17.Test.main(Test.java:18) Caused by: java.util.InputMismatchException at java.util.Scanner.throwFor(Scanner.java:864) at java.util.Scanner.next(Scanner.java:1485) at java.util.Scanner.nextInt(Scanner.java:2117) at java.util.Scanner.nextInt(Scanner.java:2076) at com.frank.chapter17.Test.getInputNumbers(Test.java:47) at com.frank.chapter17.Test.add(Test.java:31) ... 1 more 可以看到,当输入的不是整数时,发生了异常,在getInputNumbers方法里没有处理这个异常,而是将它继续抛出,在add方法里捕获了异常之后,以该异常为构造参数,重新抛出了一个异常,从打印输出的信息可以看到,不仅仅有第二次抛出的异常信息,第一次的输出信息不匹配异常的详细信息也包含在了里面,衔接在Causedby之后,形成了一条异常链,这样可以方便我们更快的排查问题所在。 至此,异常就讲解完毕了,希望能给大家带来一些启发和思考,如果觉得还算ok的话,记得动动小手点推荐,让更多人可以看到,也欢迎关注我的博客,会持续更新的。如果有什么讲的不好的地方。。。emmmmmm,你倒是来打我呀(逃) 真正重要的东西,用眼睛是看不见的。

优秀的个人博客,低调大师

【Java入门提高篇】Day16 Java异常处理(上)

当当当当当当,各位看官,好久不见,甚是想念。 今天我们来聊聊Java里的一个小妖精,那就是异常。 什么是异常?什么是异常处理? 异常嘛,顾名思义就是不正常,(逃),是Java程序运行时,发生的预料之外的事情,它阻止了程序按照程序员的预期正常执行。 异常处理,应该说异常处理机制,就是专门用来制服这个小妖精的法宝。Java中的异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰。 简而言之,Java异常处理就是能让我们主动迎击可能到来的异常,并将它们以圆润的方式处理掉。 还是先来看个小栗子,看看java里的异常长什么样。 public class Test { public static void main(String args[]){ int i = 0 / 0; System.out.println("i = " + i); } } 别慌别慌,不要看到红色提示就内心崩溃只想关掉IDE,来,抓紧我的手,带你看清“异常”这个磨人的小妖精的真面目(滑稽)。 代码里将0作为了分母,因此程序会发生算术异常,抛出一个异常后,如果没有任何处理,默认会终止程序,所以后面的打印内容并没有输出。在异常内容里,有说明异常类型为:java.lang.ArithmeticException,也就是算术异常,后面跟着的是异常原因: / by zero,也就是说异常出现的原因是将0作为了分母,而且后面还有堆栈信息,指出了异常抛出的位置是在com.frank.chapter16.main.Test.main这个包下,Test类的第11行(这个行数如果跟你想的不一样,不要在意,因为我的代码开始之前还有一些不可描述的说明信息),因为只有一次方法调用,所以没有很长的堆栈信息,看起来也很简洁明了。 所以你看,其实异常也没那么可怕吧,不仅给了异常原因,还告诉了你这个bug是出在第几行,所以好好利用它,可以帮助你写出更难以发现的bug,呸,说错了,可以帮助你更容易找到bug(手动滑稽)。 如果不希望抛出异常后程序就结束,而是希望它继续运行呢?那么就捕获它。 如何使用异常处理 我们来把上面那个栗子改改: public class Test { public static void main(String args[]){ try{ int i = 0 / 0; }catch (Exception e){ System.out.println("好像发生异常了,但是我不管,我还要继续运行"); } System.out.println("运行完毕!"); } } 输出如下: 好像发生异常了,但是我不管,我还要继续运行 运行完毕! 好的,很强势,现在即使抛出了异常,程序也继续运行了。异常就像是一头野兽,但你一旦捕获它,驯服它,就可以为你所用,为所欲为了。 try...catch...是常用的异常处理搭配,如果在try语句块中发生了异常,如果刚好这个异常被捕获到了,那么会直接跳到catch语句块中,执行catch语句中的代码,像上面的栗子里,因为对Exception类进行了捕获处理,所以当它的子类异常java.lang.ArithmeticException被抛出来的时候,也能捕获它。关于Exception类的结构层次关系,后面再做详细介绍。 还有另外一种搭配方式,那就是try...catch...finally,finally语句块比catch要强势的多,前面说了catch语句块必须要捕获到了特定的Exception才会执行里面的代码,如果catch的是ArithmeticException但是抛出的却是空指针异常,那就不会被捕获了,异常也就逃之夭夭了。这个时候,finally的优势就展示出来了,不管抛出什么样的异常,也不管是否抛出了异常,finally中的代码都会被执行。所以一般的用法是在finally语句块里释放掉那些需要被释放的资源,如socket连接,关闭io流,关闭数据库连接等等。也就是说一般在finally中收拾try中抛出的烂摊子,心疼一秒finally,果然能者多劳啊。 当然,try...finally这样的搭配也是ok的,需要注意的是,当try语句中发生了异常之后,在发生异常处之后的代码将不会再执行,而是跳到相应的catchu或者finally中去。 public class Test { public static void main(String args[]){ try{ int i = 0 / 0; }catch (NullPointerException e) { System.out.println("这里捕获空指针异常"); }catch (ArithmeticException e){ System.out.println("这里捕获算术异常"); }finally { System.out.println("这里是finally"); } System.out.println("运行完毕!"); } } 输出如下: 这里捕获算术异常 这里是finally 运行完毕! 在上面的代码中,catch语句块是可以同时使用多个的,第一个catch语句块捕获的是空指针异常,但由于抛出的是算术异常,所以没有捕获住,但被第二个catch捕获到了,所以第二个catch语句块中的代码执行了。异常匹配是按照从上到下的顺序进行匹配的,最后才执行finally中的代码块。关于try...catch...finally,还有一个很有趣的return问题,如果三个语句块里都有return,最终返回结果会是怎样呢?这里做了详细的说明,http://www.cnblogs.com/mfrank/p/7895660.html 有兴趣的话可以看一看。 绝大多数情况下,finally中的代码都是会被执行的,只有一种情况下,finally中的代码不会被执行,那就是在try语句块中结束掉了虚拟机(如:使用 System.exit(0); )。 关于异常,还有一个关键字需要介绍,那就是throw,使用throw可以主动抛出一个异常。看到这你也许会一脸懵逼,主动抛出???嫌异常不够多,凑热闹不嫌事大??别急别急,中间一定有什么误会,把刀放下,有话好好说。 throw关键字确实是用来抛出异常的,你可以这样使用: public class Test { public static void main(String args[]){ try{ throw new NullPointerException("听说你很闲,给你抛个异常。"); }catch (NullPointerException e) { System.out.println("这里捕获空指针异常,提示内容:" + e.getMessage()); e.printStackTrace(); } } } 输出如下: 这里捕获空指针异常,提示内容:听说你很闲,给你抛个异常。 java.lang.NullPointerException: 听说你很闲,给你抛个异常。 at com.frank.chapter16.main.Test.main(Test.java:11) 用throw关键字可以抛出任意类型的异常,当然,你想的话,还有抛Error,至于什么是Error,已经跟Exception的关系,将在下一篇里进行讲解。暂时不用深究。 在throw异常的时候,可以加上抛出异常的原因,这样可以更方便定位问题所在,当然,一般来说不会像栗子中这样使用的,这里只是为了简单起见。 到此为止,异常的上半篇已经讲解完毕,在这一篇里,说明了什么是异常,什么是异常处理,以及如何使用异常处理机制。相信大家对这个小妖精有了初步的认识,下一篇中,将会讲解Exception家族都有哪些成员,如何使用自定义异常,已经异常处理的实际使用中的正确姿势。欢迎大家继续关注,之后计划每周两篇以上的更新,如果有讲解遗漏或者不好的地方,欢迎大家及时指出,共同进步! 真正重要的东西,用眼睛是看不见的。

优秀的个人博客,低调大师

IoT设备网络会削减开支提高生产力吗?

Del Papa是一家位于美国德克萨斯州的啤酒、饮用水和功能饮料分销商,它在2012年春季开始在其德克萨斯市工厂中使用思科的IoT技术。这个公司曾经只是希望减少能源开支,但是它发现IoT技术也会带来其他一些红利:它能帮助工人填写订单并将订单快速发出。 这个公司现在可以监控加热、通风和空调系统,然后远程实时作出修改。紧密关注恒定温度是很重要的,因为Del Papa与Anheuser-Busch签定了协议,要保持仓库温度恒定在一个指定的温度上,以保护啤酒不变质。 类似地,公司也可以远程控制建筑物的照明。许多灯光都是自动控制的,办公室灯光在上午8点打开,然后在下午5点熄灭。仓库安装的是动作感应灯光,如果15分钟内没有检测到活动物体,它们就会自己熄灭。这会带来一些附加好处;如果系统显示仓库后面的灯光半夜里打开,那么公司就需要检查是否有人闯入建筑物了。如果灯光在深夜意外打开着,那么他们也可以远程关闭灯光。 Del Papa公司的信息系统经理Steve Holtsclaw说:“我们不得不向董事会推销其效率。这里需要一定的提前支付成本,但是如果对比一下现在与以前所消耗的电量数,我们就可以看到有很多的节省。我们还可以设定目标,确定我们每月或每年的使用限额,然后控制电源使用情况,从而将耗电量控制在目标范围之内。” 支持IoT技术的网络也会意料之外地大大提升生产力。这家公司之前使用的无线基础架构不够可靠,如果一名员工站在仓库的一个特定区域,那么他可能会失去信号,然后无法在无线设备上查看一个到达订单的明细信息。这时,这名员工又不得不走支仓库的其他区域,才能查看订单和发送产品。现在,整个仓库布满了信号很强的统一无线覆盖,完全消除了这些死角。 Holtsclaw说:“填写订单就是在销售啤酒和赚钱。你没有想到它在消耗时间,但是因为时间浪费,旧系统将8小时工作拖延到10小时工作才完成,造成延迟的原因包括订单确认时间和卡车装货时间。我们现在再也没有这样的问题了。” Holtsclaw和他的团队不得不去除大部分遗留网络,然后从零开始重新建设他们的IoT基础架构。 Holtsclaw说:“我们混搭使用了各种供应商产品,这些设备相互间无法协同工作。它们全部都已经过时,已经无法满足我们的要求了。” Del Papa的网络在接入层和分布层上运行着思科的Catalyst 3850系列和3750-X系列交换机,在核心网络中运行Nexus 7000系列交换机,然后使用Aironet 3602i AP部署WLAN和思科5508无线控制器。此外,它还使用供应商的集成服务路由器(Integrated Services Routers),用一条光纤骨干线路连接工厂,由它连接每一栋建筑内部的中间配送架。Holtsclaw希望保证所有交换机端口都支持最高10Gbps的容量,以便适应未来的扩展需求。 他说:“我购买这种设备时不仅考虑目前的使用需求,也考虑将来的需求。现在所有东西都是最低配置,但是它们可以通过简单的替换而升级配置。” 这些传感器组合使用无线和有线连接,而且它们都通过网络IP地址进行通信。Holtsclaw说:“网络上的这些传感器或节点都会主动发送心跳到管理这些设备的服务服务器和应用程序。这种主动连接支持实时管理每一台设备,以及精确读取这些设备的状态与设置。” 这家公司在安装这项技术后也遇到了一些问题——但是问题不在于技术本身应有的功能上,而在于培训非IT员工如何正确使用这项技术。 他说:“我们许多人通常还无法应付这项技术,因此需要投入很大的力量去培训人员。在前几个月里,有时候大门无法打开,因为仓库人员还在逐渐软件,所以我的团队有时候需要介入培训。” Zones是帮助建设Del Papa网络的思科合作伙伴,它的IoT解决方案副总裁Stephen Lurie指出,随着公司业务发现使用数据提升效率的新方法,IoT一定会继续增长。 Lurie说:“所有这些传感器都有自己的话语(数据)。它们使用不同的说话语言(数据传输方式)。现在,使用IoT就能够让我们听懂它们的话。” 原文发布时间为:2015年03月10日 本文作者:曾少宁翻译 本文来自云栖社区合作伙伴至顶网,了解相关信息可以关注至顶网。

优秀的个人博客,低调大师

黑客测试有望提高智能家居安全性?

目前已有大大小小的智能家居安全问题报道,让人们的神经再次紧绷。相比前两年,智能家居的叫好声逐渐平静,更多人选择理性看待智能家居的利弊,“黑客攻破智能家居”也是引发人们理性思考的原因之一。 只要是联网的设备,就会存在安全隐患,目前已有大大小小的智能家居安全问题报道,让人们的神经再次紧绷。相比前两年,智能家居的叫好声逐渐平静,更多人选择理性看待智能家居的利弊,“黑客攻破智能家居”也是引发人们理性思考的原因之一。 黑客攻破智能家居的例子 智能家居暴露安全漏洞,黑客轻而易举地入侵并非耸人听闻: 在今年的“3·15晚会”上,包括洗衣机、烤箱在内的数款智能硬件被黑客现场“入侵”,演示着被不同程度破解的情况。 世界级的黑客大赛GeekPwn5在今年5月12日落下帷幕,黑客轻松攻破了现在市面上的部分智能家居产品。包括国内比较流行的路由器,无人机以及一些知名的保险箱也被轻松攻破。 日本生产的一台机器马桶也曾被美国一家数据公司演示入侵,通过蓝牙连接操纵马桶盖的开启和关闭,黑客甚至能让马桶向用户下身喷射水流。 诸如此类的例子还很多,曾经在现场目睹黑客轻松入侵的观众,纷纷表示震惊。智能家居作为时代进步的产物,性能体验上去了,安全性却降低了,这着实让消费者不能接受,黑客到底是凭借什么方式方法入侵智能家居的呢? 据一位技术人员表示,黑客可利用安全漏洞入侵智能家居系统,根据这个,目前人们生活中所有的智能家电和家居都可以被掌控,而对于一名黑客来说,要完成这些并不需要很高的技术门槛。 为何会发生被黑客攻破的情况 除了本身具备的技术,几乎所有黑客入侵系统都是因为钻了安全漏洞,这些安全漏洞是怎么来的?很多消费者出了问题就大骂厂商,这无可厚非,毕竟每位厂商都有责任确保自己的产品安全问题,但究其根本,责任应该平摊到每个环节。 厂商层面 目前我国的智能家居行业存在一个显著问题:缺乏统一标准,厂商各自为政。智能家居会火起来,很大原因是受到了厂商的大动作宣传。近年来,互联网的发展呈现出迅猛的趋势,极大推动了各行各业的转型,智能家居贴近人们生活,更能直接体现科技给环境带来的改善,厂商正是看到了这一点,才纷纷给自家产品贴上“智能化”的标签,想以此扩展市场。 也正由于这种受到利益驱使的大动作,很多智能家居产品的安全性能尚未完善就被推出市场,厂商只专注于消费者的购买行动,却忽略了背后存在的安全隐患。 用户层面 联网的设备下没有百分百的安全性可言,这是由互联网的特性所决定的,厂商有责任做的就是把安全隐患降到最低。但如果在安全性能强大的产品面前,用户还不树立起防范意识,忽略设置密码等基本的安全防范措施,这就是在用户环节上为黑客入侵提供了方便。 技术层面 还有另外一个客观原因不得不提,相对于互联网在我国的高速发展,物联网技术才处于萌芽阶段。以往的“千年虫”“熊猫烧香”等互联网病毒曾使网友苦不堪言,如今相对应的防范技术得到了不断的完善和升级,已经能大大堵住安全漏洞。 而对于物联网这个“初生儿”来说,其安全防控体系远远赶不上它的发展速度,因此随时有可能成为黑客们的猎物,面临更严峻的挑战。智能家居作为依靠物联网技术使家居设备进行“沟通”的管理系统,很容易因为一台设备被入侵而使其他设备牵连其中,在技术这一方面,如何跟上物联网发展速度、做好安全防范不是一件容易事。 如何保障智能家居的安全 智能家居需要依靠网络通信技术来联通,就目前的技术来说,大部分家居设备在利用wi-fi来进行连接,而wi-fi本身的安全性就经常受到质疑,新闻上也经常出现因为随便连接wi-fi导致手机被入侵的报道,所以就保障智能家居安全方面,wi-fi还是难以使设备得到严密的防范。 有行内人称,目前有多重手段能够抵制黑客入侵,例如防火墙、加密、地域限制、设备权限、事件监测等。 同时,还有人认为,黑客既然能入侵破解,那么应该也能比常人更容易找到防范的方法,所谓“知其然,知其所以然”。在这点上,美国国防部曾发起一项名为“黑掉五角大楼”的活动,邀请外部黑客测试性攻击五角大楼的部分公共网络,以发现其安全漏洞。日本也打算在2020年东京夏季奥运会开幕之前,招募网络黑客加以培训,并进行网络安全性的黑客攻击测试。 以其人之道还治其人之身,这在黑客测试中或许能得到较好运用。 结语 中国整个互联网行业的发展速度已经超越了技术发展,技术发展的速度又远远超过了安全技术发展。在可预见的未来,智能家居将进入更多家庭投入使用,其安全问题也应该早日得到改进,而在这个问题,估计需要厂商、用户、技术等各个环节的配合,这才能在一条产业链上提升产品的安全性。 本文转自d1net(转载)

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册