当前位置:  编程技术>移动开发
本页文章导读:
    ▪XMP参照        XMP参考 javascript:mctmp(0);   http://blog.csdn.net/kangkangz4/article/details/7740135     ......
    ▪ Objective-C的算术表达式        Objective-C的算术表达式 . 在Objective-C中,事实上与所有的程序设计语言一样,在两个数相加时使用加号(+),在两个数相减时使用减号(-),在两个数相乘时使用乘号(*),在两个数相除时.........
    ▪ Java中的错误       Java中的异常 关键字: Throwable, Exception, Error, Runtime Exception, unChecked Exception, Checked Exception, throw, throws, try, catch, finally   我们先看看类图:     首先你需要明白,这些都是类,是对象,就和.........

[1]XMP参照
    来源: 互联网  发布时间: 2014-02-18
XMP参考

javascript:mctmp(0);

 

http://blog.csdn.net/kangkangz4/article/details/7740135

 

 


    
[2] Objective-C的算术表达式
    来源: 互联网  发布时间: 2014-02-18
Objective-C的算术表达式 .

在Objective-C中,事实上与所有的程序设计语言一样,在两个数相加时使用加号(+),在两个数相减时使用减号(-),在两个数相乘时使用乘号(*),在两个数相除时使用除号(/)。这些运算符称为二元算术运算符,因为它们运算两个值或项。

运算符的优先级

你已经看到如何在Objective-C中执行简单的运算,例如,加法。下面的程序进一步说明了减法、乘法和除法运算。在程序中执行的最后两个运算引入了一个概念,即一个运算符比另一个运算符有更高的优先级。事实上,Objective-C中的每一个运算符都有与之相关的优先级。

优先级用于确定包含多个运算符的表达式如何求值:优先级较高的运算符首先求值。如果表达式包含优先级相同的运算符,可按照从左到右或从右到左的方向来求值,具体按哪个方向求值取决于运算符。这就是通常所说的运算符结合性。

代码清单4-2

//说明各种算术运算符的用法

 

#import <Foundation/Foundation.h>

 

int main (int argc, char *argv[])

{

  @autoreleasepool {

     int  a = 100;

     int  b = 2;

     int  c = 25;

     int  d = 4;

     int  result;

 

     result = a - b;     //减法

     NSLog (@"a - b = %i", result);

 

     result = b * c;     //乘法

     NSLog (@"b * c = %i", result);

 

     result = a / c;     //除法

     NSLog (@"a / c = %i", result);

 

     result = a + b * c; //优先级

     NSLog (@"a + b * c = %i", result);

 

     NSLog (@"a * b + c * d = %i", a * b + c * d);

  }

 return 0;

}

 

代码清单4-2 输出

a - b = 98

b * c = 50

a / c = 4

a + b * c = 150

a * b + c * d = 300

 

在声明整型变量a、b、c、d及result之后,程序将a减b的结果指派给result,然后用恰当的NSLog调用来显示它的值。

下一条语句

result = b * c;

将b的值和c的值相乘并将其结果存储到result中。然后用NSLog调用来显示这个乘法的结果。到目前为止,你应该很熟悉该过程了。

之后的程序语句引入了除法运算符——斜杠(/)。100除以25得到4,可用NSLog语句在a除以c之后立即显示。

在某些计算机系统中,尝试用一个整数除以0将导致程序异常终止或出现异常。即使程序没有异常终止,执行这样的除法所得的结果也毫无意义。在第6章“选择结构”中,将看到如何在执行除法运算之前检验除数是否为0。如果除数为0,可采用适当的操作来避免除法运算。

表达式

a + b * c

不会产生结果2550(即102×25);相反,相应的NSLog语句显示的结果为150。这是因为Objective-C与其他大多数程序设计语言一样,对于表达式中多重运算或项的顺序有自己的规则。通常情况下,表达式的计算按从左到右的顺序执行。然而,为乘法和除法运算指定的优先级比加法和减法的优先级要高。因此,Objective-C认为表达式

a + b * c

等价于

a + (b * c)

(如果采用基本的代数规则,那么该表达式的计算方式是相同的。)

如果要改变表达式中项的计算顺序,可使用圆括号。事实上,前面列出的表达式是相当合法的Objective-C表达式。这样,可用表达式

result = a + (b * c);

替换代码清单4-2中的表达式,也可以获得同样的结果。然而,如果用表达式

result = (a + b) * c;

来替换,则赋给result的值将是2550,因为要首先将a的值(100)和b的值(2)相加,然后将结果与c的值(25)相乘。圆括号也可以嵌套,在这种情况下,表达式的计算要从最里面的一对圆括号依次向外进行。只要确保结束圆括号和开始圆括号的数目相等即可。

从代码清单4-2中的最后一条语句可发现,对NSLog指定表达式作为参数时,无须将该表达式的结果先指派给一个变量,这种做法是完全合法的。表达式

a * b + c * d

可根据以上述规则,按照

(a * b) + (c * d)

(100 * 2) + (25 * 4)

来计算。

求出的结果300将传递给NSLog函数。

整数运算和一元负号运算符

代码清单4-3巩固了前面讨论的内容,并引入了整数运算的概念。

代码清单4-3

//更多的算术表达式

 

#import <Foundation/Foundation.h>

 

int main (int argc, char *argv[])

{

  @autoreleasepool {

     int  a = 25;

     int  b = 2;

     float c = 25.0;

     float d = 2.0;

 

     NSLog (@"6 + a / 5 * b = %i", 6 + a / 5 * b);

     NSLog (@"a / b * b = %i", a / b * b);

     NSLog (@"c / d * d = %f", c / d * d);

     NSLog (@"-a = %i", -a);

  }

  return 0;

}

 

代码清单4-3 输出

6 + a / 5 * b = 16

a / b * b = 24

c / d * d = 25.000000

-a = -25

 

前3条语句中,在int和a、b及result的声明之间插入了额外的空格,以便对齐每个变量的声明,使用这种方法书写语句可使程序更容易阅读。还可以注意到,在迄今出现的每个程序中,每个运算符前后都有空格。这种做法同样不是必需的,仅仅是出于美观上的考虑。一般来说,在允许单个空格的任何位置都可以插入额外的空格。如果能使程序更容易阅读,输入空格键的操作还是值得做的。

在代码清单4-3中,第一个NSLog调用中的表达式巩固了运算符优先级的概念。该表达式的计算按以下顺序执行:

(1)因为除法的优先级比加法高,所以先将a的值(25)除以5。该运算将给出中间结果5。

(2)因为乘法的优先级也高于加法,所以随后中间结果(5)将乘以2(即b的值),并获得新的中间结果(10)。

(3)最后计算6加10,并得出最终结果(16)。

第二条NSLog语句引入了一种新误解。你希望a除以b,再乘以b的操作返回a(已经设置为25)。但此操作并不会产生这一结果,在输出显示器上显示的是24。难道计算机在某个地方迷失了方向?如果这样就太不幸了。其实该问题的实际情况是,这个表达式是采用整数运算来求值的。

如果回头看一下变量a和b的声明,你会想起它们都是作为int类型声明的。当包含两个整数的表达式求值时,Objective-C系统都将使用整数运算来执行这个操作。在这种情况下,数字的所有小数部分将丢失。因此,计算a除以b,即25除以2时,得到的中间结果是12,而不是期望的12.5。这个中间结果乘以2,就得到最终结果24。这样,就解释了出现“丢失”数字的情况。

在代码清单4-3的倒数第二个NSLog语句中看到,如果用浮点值代替整数来执行同样的运算,就会获得期望的结果。

决定使用float变量还是int变量应该基于变量的使用目的。如果无须使用任何小数位,就可以使用整型变量。这将使程序更加高效,换言之,它可以在大多数计算机上更快速地执行。另一方面,如果需要精确到小数位,那就很清楚应该选择什么。此时,唯一需要回答的问题是使用float还是double。对此问题的回答取决于使用数据所需的精度以及它们的量级。

在最后一条NSLog语句中,使用了一元负号运算符对变量a的值取负。这个一元运算符是用于单个值的运算符,而二元运算符作用于两个值。负号实际上扮演了一个双重角色;作为二元运算符,它执行两个数相减的操作;作为一元(或单目)运算符,它对一个值取负。

与其他算术运算符相比,一元负号运算符具有更高的优先级,但一元正号运算符(+)除外,一元正号运算符和算术运算符的优先级相同。因此,表达式

c = -a * b;

将执行-a乘以b。

 

 

本文节选自《Objective-C程序设计(第4版)》

电子工业出版社出版

[美]Stephen G. Kochan(斯蒂芬·G·科昌)著

林冀 范俊 朱奕欣 译


    
[3] Java中的错误
    来源: 互联网  发布时间: 2014-02-18
Java中的异常

关键字:

Throwable,

Exception,

Error,

Runtime Exception,

unChecked Exception,

Checked Exception,

throw,

throws,

try,

catch,

finally

 

我们先看看类图:

 

 

首先你需要明白,这些都是类,是对象,就和其它的对象没有两样,你可以为它定义方法,当然,这些方法的目的是为捕获异常而提供额外的信息,这也是我们使用异常的目的。特别是Throwable,我以前一直以为这是一个接口。

 

Throwable:

正如这个类的名字所蕴含的意思一样,是一个可被抛出的对象,这个对象定义了一个可以被抛出对象应该是什么样的,即,一个错误或者异常应该具备的基本信息。

Error:

错误一般是被虚拟机保留用于表示资源不足,或者是其它的一些使得程序无法继续执行下去的错误发生时候,被虚拟机所抛出来的。这是一个惯例,所以你最好不要自己去实现新的Error子类。如果你要抛出一个Error也是可以的,但是不建议这样做,因为这个约定俗成是让系统来抛出,如果想要抛出一个异常来中断程序,你可以抛出runtime exception。

Exception:

异常,包括了受检的异常checked exception和运行时异常runtime exception。

受检的异常比如IOException,使用它的目的是当异常发生时候,期望调用者能够适当地对异常进行恢复。比如你在读写一个文件,这时候需要catch IOException,当然这个时候如果出现了IOException,被你捕获到了,那么你可以对这个异常进行处理,比如提示用户,让用户重新测试等等,避免了程序崩溃。

运行时异常用在程序出现了错误的情况下,比如NullPointerException。这种异常和Error,一旦发生就不能被捕获,或者说捕获也没有意义,因为它直接就会导致程序的奔溃,不可恢复。

因此运行时异常runtime exception和Error都被称为unChecked Exception--未受检异常。

 

 

我们来对上面的关系进行下梳理:

首先,java语言提供了3中可抛出结构(throwable):checked exception,runtime exception,error。

throwable是他们的父类,定义了一个异常最基本的结构,error是系统级别的错误,有可能是你的程序导致的,但你不需要过多去理会,当然,继承这个类实现一个自己的Error也没有多大的意义,它和runtime exception有个共同的地方就是:一旦发生就无法恢复,直接导致程序奔溃,因此他们被称为unchecked exception。而checked exception是用来当异常发生的时候,让程序避免奔溃而采取的做法。当你认为程序可以允许恢复,那你使用checked exception,比如IOException,否则使用runtime exception,比如空指针异常NullPointerException。在不清楚到底该使用哪个的情况下,最好使用unchecked exception.

 

 

分析完上面的关系后,我们看看,该如何抛出和处理一个异常呢?

 

throw关键字是用来在java中抛出异常使用的,如下:

 

抛出运行时异常:(会导致程序崩溃)

 

public void setAge(int age) {
		
		if(age < 0)
		{
			throw new RuntimeException("Sorry ,the age of person can not be a negative number");
		}
		this.age = age;
	}

 

 

抛出错误:(会导致程序崩溃,不建议使用)

 

public void setAge(int age) {
		if(age < 0)
		{
			throw new Error("Sorry ,the age of person can not be a negative number");
		}
		this.age = age;
	}

 

抛出checked exception(不会导致程序奔溃,在当前方法中处理异常):

 

public void setAge(int age) {
		
		if(age < 0)
		{
			
			try {
				throw new Exception("Sorry ,the age of person can not be a negative number");
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		this.age = age;
	}
 

 

抛出checked exception(不会导致程序奔溃,将异常抛出给调用这个方法的地方进行处理):

 

public void setAge(int age) throws Exception{
		
		if(age < 0)
		{
			throw new Exception("Sorry ,the age of person can not be a negative number");
		}
		this.age = age;
	}
 

 

对应的,我们在调用这个方法的时候,需要这样做:

 

try {
					person.setAge(-1);
				} catch (Exception e) {
					// 这里不要让处理异常的地方空着,这样就算捕获到了异常也没有意义了,
					// 如果你认为这个地方可以不做任何处理,至少需要包含一条提示,说明下为什么不做处理。方便以后调试,或者供别人参考
					Log.e(TAG, "You shoud check the value of name before pass it to the method");
					showExceptionTip();//对错误进行处理
					e.printStackTrace();
				}

 或者你也可以这样处理:假如这个调用者,自己也会被别人调用,那么也可以不处理这个方法,也通过Throws Exception将异常抛出去。交给外部调用者来处理,就好像是,我不知道该如何处理这个问题,就把他交给上级来处理。

 

 

 

注意:当你catch到异常的时候,并不是不做处理,这样就算捕获到了异常也没有意义了,如果你认为这个地方可以不做任何处理,至少需要包含一条提示,说明下为什么不做处理。方便以后调试,或者供别人参考。

 

前面我们说的,抛出runtime exception,error,checked exception.还有一种情况是这样的:

抛出throwable,即,它们的父类

 

public void setAge(int age){
		
		if(age < 0)
		{
			try {
				throw new Throwable("Sorry ,the age of person can not be a negative number");
			} catch (Throwable e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		this.age = age;
	}

 或:

 

public void setAge(int age) throws Throwable{
		if(age < 0){
			throw new Throwable("Sorry ,the age of person can not be a negative number");
		}
		this.age = age;
	}

 这种做法虽然可以,但是是不可取的,为什么呢?但是你会发现,由于Throwable是Error和Exception的父类,如果发生错误了,你甚至都不知道这个错误是Error还是Exception,这肯定不是我们使用异常处理想达到的目的。

 

 

看完上面的代码块现在说明下我们所用到的关键字:

 

throw,throws

 

throw表示将这个异常抛出去,它可以抛出unchecked exception(runtime exception,error),checked exception,throwable.即,可以抛出Throwable对象及其之类,由于unchecked exception如果发生了,直接导致程序奔溃,因此就没有将异常交给外部来处理这个概念了,而对于checked exception来说,它的目的是对程序发生的异常就行处理,避免程序奔溃,因此,总是需要对发生的异常进行处理,至于在哪里处理,这个你可以灵活选择,如果你不想在本方法中进行处理,你可以选择在外部进行处理,即,调用这个方法的地方进行处理,这个时候你就需要使用throws关键字,将它抛出去了。当然正如我前面所说的,这个异常还可以再被抛出去,一级一级递归上去,直到你希望它在哪个地方进行处理。

 

具体处理异常的时候,我们使用的是try catch,关键字

这个不做解释,大家都懂,需要注意的是,try块应该尽量的小,这样方便你捕获异常。

 

 

最后我们讲一讲finally关键字,finally不是每次调用try catch的时候都需要调用它来对资源进行清理,使用它的目的是:对一些消耗内存的对象进行释放,比如数据库连接对象JDBC啊,等等。注意:释放的时候先要判断是对象是否为null。

 

下面是开发过程中常见的错误汇总:

 

1.丢弃异常,即如我前所说的,捕获到了异常却不做处理,那捕获了又有什么意义呢?

2.不指定具体的异常,其实我这里为了演示的方便,也没有指定具体的异常,实际开发中应该指定具体的异常,这样方便调试,还有一点是,如果你捕获多个异常的时候,即同时catch多个具体异常时候,需要从小到大,不能将Exception放在第一个,这样你永远都不会捕获到具体的异常,等于下面的具体异常都是dead code

3.异常捕获后没有对大的资源进行释放,这时候我们就需要使用finally

4.try块过于庞大,这样很不利于调试。

 

 

下面是针对上面的代码块调试过程中对Logcat的各种截图:

 

unchecked exception:运行时异常RuntimeException:

 

unchecked exception:Error:不推荐这样做,约定俗成Error是给系统用的

 

checked exception:

 

checked exception:带有Log说明的,这样做方便找出问题,毕竟e.printStackTrace();打印出的有效信息不多,自己定义说明,有利于调试

 

抛出throwable:不推荐这样的做法,因为实在不利于调试

 

 

 

下面是代码块所在的工程,有兴趣的同学可以去下载来看看:

 

https://github.com/michaelye/ExceptionDemo

 

 


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
java开发知识 iis7站长之家
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3