接口 类型转换 try-catch(学习笔记)
(抽象類,接口)內(nèi)容已經(jīng)在前面的博客有記載http://www.cnblogs.com/tobecabbage/p/3460984.html? http://www.cnblogs.com/tobecabbage/p/3468115.html
- 轉(zhuǎn)換的說明
-》隱式類型轉(zhuǎn)換:正常的值類型的隱式轉(zhuǎn)換,里氏轉(zhuǎn)換原則,裝箱
double? dNum=123;
-》強(qiáng)制類型轉(zhuǎn)換:正常的值類型的強(qiáng)制轉(zhuǎn)換,里氏轉(zhuǎn)換原則,拆箱
int num=(int)123.456;
-》類型轉(zhuǎn)型
int? num=Convert.ToInt32("123");
計(jì)算機(jī)只認(rèn)識0和1,所以用二進(jìn)制表示(兩個位bit),8個bit表示一個字節(jié)
int32 4個字節(jié) 0000 0000 0000 0000 0000 0000 0000 0000
因這二進(jìn)制不便于閱讀,所以計(jì)算機(jī)用16進(jìn)制描述數(shù)據(jù)。
8位一個字節(jié)
0000 0001 1?
0000 0010 2
0000 0011 3
0000 0100 4
0000 0101 5
0000 0110 6
0000 0111 7
....
1111 1111 0-255共256個數(shù)字? 恰好是16的平方
??????? 二進(jìn)制?? 16進(jìn)制
1000 8
1001 9
1010 a
?? 1011?? b
1100???c
?? 1101 d
?????????1110 e
1111??? f
0001 0000??? 10
?單步調(diào)試到Main方法的最后一行,查看變量內(nèi)存地址中數(shù)據(jù)
?
?
double類型的數(shù)據(jù)可以除以0,得到正無窮大
double bd=90.0000; Console.WriteLine(bd/0.0000000000);//結(jié)果為正無窮大?
里氏轉(zhuǎn)換見前面的博客已有記載,簡單解釋概括為:子類的對象new sub()分配的內(nèi)存空間地址偏移量比父類的對象New base()要大。所以一個父類的引用變量指向一個子類的對象是可以的,只是訪問不到子類的數(shù)據(jù)而已(若想訪問到子類對象的數(shù)據(jù),需要重寫父類的方法)。而一個父類的對象地址偏移量小,卻用一個子類的引用變量指向,這就意味這可以用這個子類的引用變量反問到子類的數(shù)據(jù),可是該子類引用變量指向的確實(shí)父類的對象,內(nèi)存空間里根本沒有子類的數(shù)據(jù)。這與子類引用變量能訪問到子類的數(shù)據(jù)相矛盾()。
里氏轉(zhuǎn)換 base? b= new sub();???? sub s=(sub)b;因?yàn)閎本來指向的就是一個sub()對象,里面存有子類的數(shù)據(jù),所以sub類型引用變量s能訪問到sub對象的數(shù)據(jù)。轉(zhuǎn)換陳功。里氏轉(zhuǎn)換的存在的目的是為了實(shí)現(xiàn)多肽。
?
裝箱拆箱前面博客已有記
- 異常是程序中運(yùn)行時錯誤,它違反了一個系統(tǒng)的約束或應(yīng)用程序約束,或出現(xiàn)了正常操作時未預(yù)料的情形。?
Convert.ToInt32("123abc");//格式不正確
Convert.ToInt32("12345678901234567890");//對于int32太大或太小
寫程序
-》遇到程序怎么樣讓程序不掛起
-》怎樣拋出異常
try語句
如果程序沒有提供處理異常的代碼,系統(tǒng)會掛起這個程序。
?try語句用來指明被正異常保護(hù)的代碼塊,并提供代碼以處理異常。
?catch字句部分含有一個或多個catch字句。,這些都是處理異常的代碼塊,它們也稱為是異常的處理程序。
?finally塊含有在所有情況下都要被執(zhí)行的代碼,無論有沒有異常發(fā)生。
catch字句部分與finally字句部分必須至少有一個,如果兩個都有,finally必須放在最后,即catch字句的后面
處理異常的代碼
satic void Main(){
int x=10;
try{
int y=0;
x/y;
}
catch{
...//處理異常的代碼
Console.WriteLine("Handling all exceptions - Keeping on Runing");
}
}
這段代碼產(chǎn)生以下消息。注意,除了輸出消息,沒有異常已經(jīng)發(fā)生的跡象。
Handling all exceptions-Keeping on Runing
異常類
有許多不同類型的異常可以在程序中發(fā)生,BCL定義了許多類,每一個類代表了一個指定的異常類型。當(dāng)一個異常發(fā)生時,CLR:
?創(chuàng)建該類型的異常對象;
?尋找適當(dāng)?shù)腸atch字句以處理它。
所有的異常都從根本上派生自System.Exception類。
System.Exception:所以異常類的基類
??-》SystemException:所有預(yù)定義系統(tǒng)異常的基類。IndexOfRangeException NullReference IOException
? -》ApplicationException:所有致命的、應(yīng)用程序定義的異常的基類。
異常對象含有只讀屬性,帶有導(dǎo)致該異常的信息。
屬性?????? 類型???? 描述
Message string 這個屬性含有解釋異常的原因的消息
? StackTrace???string ?這個屬性含有描述異常發(fā)生在何處的信息
???? InnerException? Exception 如果當(dāng)前異常是由另一個異常引起的,這個異常包含前一個異常的引用
???? HelpLink???????? string?????? 這個屬性可以被應(yīng)用程序定義的異常設(shè)置,為異常原因信息提供URN或URL
???? Source??????????? string?????? 如果沒有被應(yīng)用程序定義的異常設(shè)定,那么這個屬性含有異常起源所在的程序集的名稱。
Catch字句的三種形式
catch{
? Statements?? 一般catch字句,在catch關(guān)鍵字之后沒有參數(shù)列表,匹配try塊中引起的任何類型的異常。
}
catch(ExceptionType){
Statements? 特定catch字句 帶有異常類的名稱作為參數(shù) 匹配任何該類型的異常
}
catch(ExceptionType Exception){
? Statements??? 帶對象的的特定Catch字句,在異常類名稱之后包括一個標(biāo)識符,該標(biāo)識符在catch字句塊中相當(dāng)于一個本地變量,并被稱為異常變量
}?????????????????????異常變量應(yīng)用異常對象,并能用于訪問該變量的信息
一般catch字句能接受任何異常,但不能確定引發(fā)異常的類型。
特定catch字句形式把一個異常類的名作為參數(shù),它匹配該指定類或派生自它的異常類的異常。
帶對象的特定catch字句提供最多的關(guān)于異常的信息。它匹配指定類的異常,或派生自它的異常類的異常。它還給出一個異常實(shí)例,稱為異常變量,它是一個對CLR創(chuàng)建的異常對象的引用。
?使用特定Catch字句的示例
int x=0;
try{
int y=0;
x/y;
}
catch(DivideByException){
...
Console.WritelLine("Handling an exception");
}
int x=0;
try{
int y=0;
x/y;
}
catch(DividedByException e){
Console.WriteLine("Messsage:{0},e.Message);
Console.WriteLine("Source:{0},e.Source);
Console.WriteLine("Stack:{0},e.StackTrace);
}
Catch 字句塊目的是允許你以一種優(yōu)雅的方式處理異常。
catch字句塊可以包含多個catch字句,特定catch 字句允許多于一個,一般catch字句只允許一個。
catch字句的排序有兩個重要的規(guī)則
?特定catch字句必須以一種順序排序,最明確的異常類型第一,直到最普通的類型,例如,如果聲明一個派生自NullReferenceException的異常類,那么派生自異常類型的Catch子句應(yīng)該被列在NullReferenceException的catch字句之前。
?如果有一個catch子句,它必須是最后一個,它必須在所有特定的catch子句之后,使用一般catch子句一般是不好的,應(yīng)該盡可能使用特定的catch子句。一般catch子句通過讓程序繼續(xù)執(zhí)行隱藏錯誤。
- 拋出異常
func1(){func2();}
func2(){func3();}
func3(){func4();}
如果func4()里面出現(xiàn)異常,首先在func4()里查找是否有匹配的異常處理的代碼,若沒有,繼續(xù)往上拋異常,在func3()里面找匹配的代碼塊...若一直沒找找到,就拋給Main()方法,若還是找不到匹配的異常處理代碼,繼續(xù)拋給CLR,繼續(xù)拋給操作系統(tǒng)。
class Program{static void Main(string[] args){Myclass MCls = new Myclass();try{MCls.A();}catch (System.DivideByZeroException){Console.WriteLine("catch cause in main()");}finally{Console.WriteLine("finally cause in main()");}Console.WriteLine("After try statement in Main.");Console.WriteLine(" ---keep running");Console.ReadKey();}}class Myclass{public void A(){try{B();}catch (System.NullReferenceException){Console.WriteLine("catch clause in A()");}finally{Console.WriteLine("finally clause in A()");}}void B(){int x = 0, y = 0;try{x/=y;}catch (System.IndexOutOfRangeException){Console.WriteLine("catch clause in B()");}finally{Console.WriteLine("finally clause in B()");}}}程序運(yùn)行結(jié)果
圖解:
?拋出異常
throw new Exception();
- ?異常的性能問題
從以上代碼中可以看出,try{}catch(){}會導(dǎo)致運(yùn)行速度非常慢。所以建議慎用try-catch字句,盡可能用if-esle。若是涉及到訪問本地文件,沒有權(quán)限,或是訪問數(shù)據(jù)庫,網(wǎng)忽然斷掉的異常采用try-catch
?
?
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
轉(zhuǎn)載于:https://www.cnblogs.com/tobecabbage/p/3528076.html
總結(jié)
以上是生活随笔為你收集整理的接口 类型转换 try-catch(学习笔记)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于memcached
- 下一篇: 后台服务器控件点击跳转另一页面显示本页面