異常處理
語法處理上和 Java 類似,但是又不盡相同。
java的異常處理
public class ExceptionDemo {
public static void main(String[] args) {
try {
int a = 10;
int b = 0;
int c = a / b;
}catch (ArithmeticException e){
// catch 時,需要將範圍小的寫到前面
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}finally {
System.out.println("finally");
}
}
}
注意事項
(1)Java 語言按照 try—catch—finally 的方式來處理異常
(2)不管有沒有異常捕獲,都會執行 finally,因此通常可以在 finally 代碼塊中釋放資源。
(3)可以有多個 catch,分別捕獲對應的異常,這時需要把範圍小的異常類寫在前面,把範圍大的異常類寫在後面,否則編譯錯誤。
Scala 異常處理
def main(args: Array[String]): Unit = {
try {
var n= 10 / 0
}catch {
case ex: ArithmeticException=>{
// 發生算術異常
println("發生算術異常")
}
case ex: Exception=>{
// 對異常處理
println("發生了異常 1")
println("發生了異常 2")
}
}finally {
println("finally")
}
}
總結:
我們將可疑代碼封裝在 try 塊中。在 try 塊之後使用了一個 catch 處理程序來捕獲異常。如果發生任何異常,catch 處理程序將處理它,程序將不會異常終止。
Scala 的異常的工作機制和 Java 一樣,但是 Scala 沒有“checked(編譯期)”異常, 即 Scala 沒有編譯異常這個概念,異常都是在運行的時候捕獲處理。
異常捕捉的機制與其他語言中一樣,如果有異常發生,catch 子句是按次序捕捉的。因此,在 catch 子句中,越具體的異常越要靠前,越普遍的異常越靠後,如果把越普遍的異常寫在前,把具體的異常寫在後,在 Scala 中也不會報錯,但這樣是非常不好的編程風格。
finally 子句用於執行不管是正常處理還是有異常發生時都需要執行的步驟,一般用於對象的清理工作,這點和 Java 一樣。
用 throw 關鍵字,拋出一個異常對象。所有異常都是 Throwable 的子類型。throw 表達式是有類型的,就是 Nothing,因為 Nothing 是所有類型的子類型,所以 throw 表達式可以用在需要類型的地方
def test():Nothing = {
throw new Exception("不對")
}
// java 提供了 throws 關鍵字來聲明異常。
// 可以使用方法定義聲明異常。
// 它向調用者函數提供了此方法可能引發此異常的信息。
// 它有助於調用函數處理並將該代碼包含在 try-catch塊中,以避免程序異常終止。
// 在 Scala 中,可以使用 throws 註解來聲明異常
Scala
def main(args: Array[String]): Unit = {
f11()
}
@throws(classOf[NumberFormatException])
def f11()={
"abc".toInt
}
IO
輸入
Source.fromFile()
輸入行
/**
* 2019/11/18
* @author Hangge.z WX:17710299606
*/
object LineIO {
def main(args: Array[String]): Unit = {
// 讀取文件
val bs: BufferedSource = Source.fromFile("d://data.txt")
// 獲取所有的行
val lines: Iterator[String] = bs.getLines()
// 遍歷所有的行
for (line <- lines) {
println(line)
}
// 行列表
val list: List[String] = lines.toList
//行數組
val array: Array[String] = lines.toArray
// 整個字符串
val content: String = lines.mkString
// 釋放資源
bs.close()
}
}
輸入字節
/**
* 2019/11/18
* @author Hangge.z WX:17710299606
*
*/
object ByteIo {
def main(args: Array[String]): Unit = {
val bs: BufferedSource = Source.fromFile("d://data.txt")
// 獲取輸入流對象
val reader: InputStreamReader = bs.reader()
//跳過指定長度 到指定位置
reader.skip(1)
// 讀取一個字節
val byte: Int = reader.read()
println(byte) // 99
reader.close()
bs.close()
}
}
def main(args:Array[String]):Unit={
val file = new File("F:\\info.bin")
val in = new FileInputStream(file)
val bytes = new Array[Byte](file.length.toInt)
in.read(bytes)
in.close
讀取其他數據源
//從URL讀取
val source= Source.fromURL("http://www.baidu.com","UTF-8")
val lineIterator =source.getLines
for(l<-lineIterator){
println(l.toString())
}
//從給定的字符串讀取--調試有用
val source2= Source.fromString("Hello DOIT")
println(source2.mkString)//Hello DOIT
//從標準輸入讀取
val in: BufferedReader = Console.in
println(in.readLine())
輸出
def main(args: Array[String]): Unit = {
val out = new PrintWriter("F:\\aa.txt")
for(i<-1 to 100)
out.println(i)
p.write("")
p.write(Array[Char]('a'))
p.append("")
out.close
}