動態

詳情 返回 返回

scala異常和IO - 動態 詳情

異常處理

語法處理上和 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
}
user avatar wordpressjidi 頭像 Pengj 頭像
點贊 2 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.