再起风云:关于java异常处理try, catch的疑惑....小弟刚从汇编,c/c++转过android 本帖最后由 szuzsq 于 2014-11-14 10:14:42 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 首先,异常处理是人们在创造java时带来的一个概念或者说用法,和你所说的返回值判断没有太本质的区别。但是返回值判断需要你对于你引用的方法(依你熟悉的应该叫函数)十分的了解。java和C#所倡导的面向对象编程,就是别人可以完全封装一个方法,你一眼其内容都不用阅读,即可以使用。其抛出的异常编译器强制你必须处理,也就避免了你“忘记”处理异常的几率。其次,所谓代码优美否,这个是仁者见仁的事情,每个人对于代码都有自己的结构思路,不能强求相同,其实最牛的工程师,是可以接受并适应任何代码风格,且可以迅速理解原作者的思路,并按照原作者思路进行仿制修改,以保证同一应用代码风格一致性。编程,搞程序,其实是一项工程,作为工程师其实并不是一味追求完美。完美主义者是科学家。最后,lz说有人反对java异常处理,我觉得是lz理解有些许偏差,lz可以再做详细的描述。 谢谢楼上的,,,我是从这里,看到一些人在争论java的try,catchhttp://www.cnblogs.com/mailingfeng/archive/2012/11/14/2769974.html你有空可以看看...其实try catch并不是java专有的,高级语言c++,pascal等都有...只不过,其他语言都是:"我有这个功能,你可以用,也可以不用..."但只有java才是:"我觉得这个灰机好,你尽量用..并且我的api都在用,你要用我的api,就不得不用...."异常处理的原理,可以追索到,硬件中断指令.是很花销cpu的....即然java提倡,那就用吧..呵呵..我纠结的是,怎么样将java代码写得简洁一点...比如上面我提到的代码A,霹雳啪啦50行代码....干的其实就是代码B,20行的活.....----------------------------------------------------------------------------我说的异常代表一种错误的返回值就是,比如登陆操作,正确情形下,就登陆了;如果用户名不存在,则抛出UserUnexitsException;如果密码不正确,则抛出PasswordInvalidException;而c++,也支持异常,但一般是,正确则返回0,用户名不存在则返回-1,密码不正确则返回-2...至于0,-1,-2代表的函义需要记忆,也是可以优化的.一是用宏定义;一是使用枚举类型,可以从他们的名称里体现函义...哦,我还想起一点,就是java截获异常时,基本上都可以e.printStackTrace();将信息打印到LogCat里面去,辅助调试...----------------------------------------------------------------------------我给出的网址里,有人也提到了,很多异常类,除了名字不同之外,完全就是继承Exception的空壳子....设计模式里提到,多用组合,少用继承....... 感谢lz回复,我大概扫了一下文章,可能理解的略有偏颇,望指正。从我本人而言,我对于Exception的理解还是文中所谓的“初级阶段”或者说“误解”,即我的编程喜欢只喜欢把系统级异常使用Exception处理,而业务、逻辑级(比如密码错误)更倾向于lz所说的返回值处理,其中一个原因就是异常定义过于繁杂编程的时候工作量……比如某一个稍复杂的信息录入方法,我调用的时候需要处理30种异常……甚至异常本身的管理都会出现问题。当然也有可能是本人经验的确有限,还没学习过更为科学华丽的异常管理结构。另,对于lz所说的代码A的优化,首先相同异常且相同处理的语句可以合并,例如: try { is.close(); os.close(); catch(IOException e) { //TODO... }其次,我大概梳理修改了一下,时间有限没有细作推敲,希望lz指正 public static void ReinstallLibrary2(String dst, int raw) { InputStream is = Global.mainContext.getResources().openRawResource(raw); if (is == null) return; OutputStream os = null; try { os = new FileOutputStream(dst); byte[] buf = new byte[1024]; while (true) { int len = 0; len = is.read(buf); if (len <= 0) break; os.write(buf, 0, len); } is.close(); os.close(); } catch (FileNotFoundException e) { //TODO... } catch (IOException e){ //TODO... } } try { is.close(); //这样的做法应该不行....如果这句抛出异常的话,那么下面这句os.close();就没机会执行了.句柄没有及时释放,泄露资源了. os.close();catch(IOException e) {}后面的雷同....其实在java最外面套上一层try,catch这种做法,相当于压根就没用上java异常处理的思想...任何一个地方都有可能出错,但catch的时候,有时并不能确切知道是哪里出的错....而且最主要的是一些释放资源的代码没有保证被执行 android apk混淆的问题 悲剧啊,android ProgressBar 好奇怪的问题,各位一块研究下。。 sundy Android高级应用开发 分享 三星平板android程序咨询 Sqlite baseadapter image 一个APP能启动另一个APP么? 请问像知乎客户端中在正文动态插入视频的效果是如何实现的? Android 代码下,about.xml文件是干嘛的,求解,, 求大神指教 关于Android上传多个图片到.net webservice上 Android 如何判断自己是否设为默认程序
我是从这里,看到一些人在争论java的try,catch
http://www.cnblogs.com/mailingfeng/archive/2012/11/14/2769974.html
你有空可以看看...其实try catch并不是java专有的,高级语言c++,pascal等都有...
只不过,其他语言都是:"我有这个功能,你可以用,也可以不用..."
但只有java才是:"我觉得这个灰机好,你尽量用..并且我的api都在用,你要用我的api,就不得不用...."异常处理的原理,可以追索到,硬件中断指令.是很花销cpu的....即然java提倡,那就用吧..呵呵..
我纠结的是,怎么样将java代码写得简洁一点...
比如上面我提到的代码A,霹雳啪啦50行代码....
干的其实就是代码B,20行的活.....----------------------------------------------------------------------------
我说的异常代表一种错误的返回值就是,比如登陆操作,正确情形下,就登陆了;如果用户名不存在,则抛出UserUnexitsException;如果密码不正确,则抛出PasswordInvalidException;
而c++,也支持异常,但一般是,正确则返回0,用户名不存在则返回-1,密码不正确则返回-2...至于0,-1,-2代表的函义需要记忆,也是可以优化的.一是用宏定义;一是使用枚举类型,可以从他们的名称里体现函义...哦,我还想起一点,就是java截获异常时,基本上都可以e.printStackTrace();
将信息打印到LogCat里面去,辅助调试...----------------------------------------------------------------------------
我给出的网址里,有人也提到了,很多异常类,除了名字不同之外,完全就是继承Exception的空壳子....
设计模式里提到,多用组合,少用继承.......
从我本人而言,我对于Exception的理解还是文中所谓的“初级阶段”或者说“误解”,即我的编程喜欢只喜欢把系统级异常使用Exception处理,而业务、逻辑级(比如密码错误)更倾向于lz所说的返回值处理,其中一个原因就是异常定义过于繁杂编程的时候工作量……比如某一个稍复杂的信息录入方法,我调用的时候需要处理30种异常……甚至异常本身的管理都会出现问题。当然也有可能是本人经验的确有限,还没学习过更为科学华丽的异常管理结构。另,对于lz所说的代码A的优化,首先相同异常且相同处理的语句可以合并,例如:
try {
is.close();
os.close();
catch(IOException e) {
//TODO...
}
其次,我大概梳理修改了一下,时间有限没有细作推敲,希望lz指正
public static void ReinstallLibrary2(String dst, int raw) {
InputStream is = Global.mainContext.getResources().openRawResource(raw);
if (is == null)
return;
OutputStream os = null;
try {
os = new FileOutputStream(dst);
byte[] buf = new byte[1024];
while (true) {
int len = 0;
len = is.read(buf);
if (len <= 0)
break;
os.write(buf, 0, len);
}
is.close();
os.close();
} catch (FileNotFoundException e) {
//TODO...
} catch (IOException e){
//TODO...
}
}
try {
is.close(); //这样的做法应该不行....如果这句抛出异常的话,那么下面这句os.close();就没机会执行了.句柄没有及时释放,泄露资源了.
os.close();
catch(IOException e) {
}
后面的雷同....
其实在java最外面套上一层try,catch这种做法,相当于压根就没用上java异常处理的思想...
任何一个地方都有可能出错,但catch的时候,有时并不能确切知道是哪里出的错....
而且最主要的是一些释放资源的代码没有保证被执行