日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java 运行异常处理_Java编程异常处理和I/O流

發(fā)布時(shí)間:2023/12/9 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 运行异常处理_Java编程异常处理和I/O流 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

重點(diǎn):  1.在編寫程序時(shí),要正確地使用捕獲例外和聲明拋出異常的兩種例外處理的方法。

2.遇到實(shí)際問題時(shí),要根據(jù)需要正確使用各種輸入/輸出流,特別是對(duì)中文使用適當(dāng)?shù)淖址斎肓鳌?/p>

3.正確使用對(duì)象串行化的方法。

難點(diǎn):

1.如何使用Java中兩種異常處理機(jī)制,拋棄異常和聲明拋棄異常的區(qū)別與聯(lián)系。

2.處理字符流時(shí),其構(gòu)造方法的參數(shù)是一個(gè)字節(jié)流。

3.對(duì)象串行化的概念。

(一)處理異常

有的異常在編譯(輸入命令行)時(shí)出現(xiàn),而有的異常是在運(yùn)行時(shí)出現(xiàn)。

異常處理機(jī)制:捕獲異常(try-catch-finally)-積極機(jī)制、拋出異常(throw)-消極機(jī)制

異常類的層次:Throwable類中的Error、Exception類

Error類:LinkageError 動(dòng)態(tài)鏈接失敗、VirtualMachineError 虛擬機(jī)錯(cuò)誤、AWTError

Exception類:RuntimeException運(yùn)行時(shí)異常(算術(shù)異常除0錯(cuò)、數(shù)組下標(biāo)越界等)、IOExcetpion(非運(yùn)行時(shí)異常)、AWTError。。。

運(yùn)行時(shí)的異常Java編譯器允許程序員不做處理,而非運(yùn)行時(shí)的異常Java編譯器要求程序員必須進(jìn)行捕獲或拋出異常的處理:

1.try-catch-finally語句:

try{......}

catch( ExceptionName1 e

){......}?//ExceptionName1

異常子類

catch( ExceptionName2 e

){......}?//ExceptionName2

異常父類

finally{......}

【注意】catch

語句的順序:

捕獲例外的順序和catch語句的順序有關(guān),當(dāng)捕獲到一個(gè)異常時(shí),剩下的catch語句就不再進(jìn)行匹配。因此,在安排catch語句的順序時(shí),首先應(yīng)該捕獲最特殊的異常,然后再逐漸一般化。也就是一般先安排子類,再安排父類。

通過finally語句為異常處理提供一個(gè)統(tǒng)一的出口,不論在try代碼塊中是否發(fā)生了異常事件,finally塊中的語句都會(huì)被執(zhí)行。

2.throws聲明語句:

如果在一個(gè)方法中生成了一個(gè)異常,但是這一方法并不確切地知道該如何對(duì)這一異常事件進(jìn)行處理,這時(shí),一個(gè)方法就應(yīng)該聲明拋棄異常,使得異常對(duì)象可以從調(diào)用棧向后傳播,直到有合適的方法捕獲它為止。

public int read ()?throws?IOException{

......

}

注意:throws子句中同時(shí)可以指明多個(gè)異常,之間由逗號(hào)隔開。例如:

public static void main(String

args[])?throws

IOException,IndexOutOfBoundsException?{…}

3.throws語句:IOException e=new

IOException();throw

e ; //注意:此處拋出的對(duì)象必須是異常實(shí)例,不可拋出其他。

(二)自定義異常類的使用:

自定義異常類必須是Throwable的直接或間接子類。

【注意】:一個(gè)方法所聲明拋出的異常是作為這個(gè)方法與外界交互的一部分而存在的。所以,方法的調(diào)用者必須了解這些異常,并確定如何正確的處理他們。

(三)I/O

流概述:

I/0流:輸入/輸出處理源(stream),比如從鍵盤讀取數(shù)據(jù)、從文件中讀取數(shù)據(jù)或向文件中寫數(shù)據(jù)等等。Jdk

提供了包java.io,其中包括一系列的類來實(shí)現(xiàn)輸入/輸出處理。

1.字節(jié)流:(byte)

從InputStream和OutputStream派生出來的一系列類。

◇ InputStream、OutputStream

◇ FileInputStream、FileOutputStream

◇ PipedInputStream、PipedOutputStream

◇ ByteArrayInputStream、ByteArrayOutputStream

◇ FilterInputStream、FilterOutputStream

◇ DataInputStream、DataOutputStream

◇ BufferedInputStream、BufferedOutputStream

2.字符流:(以16位的Unicode碼表示的字符)

從Reader和Writer派生出的一系列類:

◇ Reader、Writer

◇ InputStreamReader、OutputStreamWriter

◇ FileReader、FileWriter

◇ CharArrayReader、CharArrayWriter

◇ PipedReader、PipedWriter

◇ FilterReader、FilterWriter

◇ BufferedReader、BufferedWriter

◇ StringReader、StringWriter

3.對(duì)象流

◇ ObjectInputStream、ObjectOutputStream

4.其它:

◇ 文件處理:

File、RandomAccessFile;

◇ 接口

DataInput、DataOutput、ObjectInput、ObjectOutput;

InputStream

◇ 從流中讀取數(shù)據(jù):

int read(

);?//讀取一個(gè)字節(jié),返回值為所讀的字節(jié)  int

read( byte b[ ] );?//讀取多個(gè)字節(jié),放置到字節(jié)數(shù)組b中,通常讀取的字節(jié)數(shù)量為b的長(zhǎng)度

//返回值為實(shí)際讀取的字節(jié)的數(shù)量

int read( byte b[ ], int off, int len

);?//讀取len個(gè)字節(jié),放置到以下標(biāo)off開始字節(jié)數(shù)組b中

//返回值為實(shí)際讀取的字節(jié)的數(shù)量

int available( );   //返回值為流中尚未讀取的字節(jié)的數(shù)量

long skip( long n );?//讀指針跳過n個(gè)字節(jié)不讀,返回值為實(shí)際跳過的字節(jié)數(shù)量

◇ 關(guān)閉流:

close( );?//流操作完畢后必須關(guān)閉

◇ 使用輸入流中的標(biāo)記:

void mark( int readlimit );?//記錄當(dāng)前讀指針?biāo)谖恢?#xff0c;讀指針讀出readlimit個(gè)字節(jié)后所標(biāo)記的指針位置失效

void reset( );?//把讀指針重新指向用mark方法所記錄的位置

boolean markSupported( ); //當(dāng)前的流是否支持讀指針的記錄功能

有關(guān)每個(gè)方法的使用,詳見java

API。

OutputStream

◇ 輸出數(shù)據(jù):

void write( int b );   //往流中寫一個(gè)字節(jié)b

void write( byte b[ ] );?//往流中寫一個(gè)字節(jié)數(shù)組b

void write( byte b[ ], int off, int len

);?//字節(jié)數(shù)組b中從下標(biāo)off開始,長(zhǎng)度len的字節(jié)寫入流

◇ flush( );  //刷空輸出流,并輸出所有被緩存的字節(jié)

由于某些流支持緩存功能,該方法將把緩存中所有內(nèi)容強(qiáng)制輸出到流中。

◇ 關(guān)閉流:

close( );?//流操作完畢后必須關(guān)閉

5.I/O中的異常:進(jìn)行I/O操作時(shí)可能會(huì)產(chǎn)生I/O異常,屬于非運(yùn)行時(shí)例外,應(yīng)該在程序中處理。如:FileNotFoundException,

EOFException, IOException

(四)文件處理:

java.io包中有關(guān)文件處理的類有:File、FileInputStream、FileOutputStream、RamdomAccessFile和FileDescriptor;接口有:FilenameFilter。

文件類(File):

◇ 文件或目錄的生成

public File(String path);

public File(String path,String name);//path是路徑名,name是文件名

public File(File dir,String name);//dir是路徑名,name是文件名

文件名的處理

String getName( );?//得到一個(gè)文件的名稱(不包括路徑)

String getPath( );?//得到一個(gè)文件的路徑名

String getAbsolutePath( );//得到一個(gè)文件的絕對(duì)路徑名

String getParent( );?//得到一個(gè)文件的上一級(jí)目錄名

String renameTo(File newName);?//將當(dāng)前文件名更名為給定文件的完整路徑(移動(dòng)、復(fù)制粘貼)

文件屬性測(cè)試

boolean exists( );?//測(cè)試當(dāng)前File對(duì)象所指示的文件是否存在

boolean canWrite( );//測(cè)試當(dāng)前文件是否可寫

boolean canRead( );//測(cè)試當(dāng)前文件是否可讀

boolean isFile( );?//測(cè)試當(dāng)前文件是否是文件(不是目錄)

boolean isDirectory( );?//測(cè)試當(dāng)前文件是否是目錄(不是文件)

普通文件信息和工具

long lastModified( );//得到文件最近一次修改的時(shí)間

long length( );?//得到文件的長(zhǎng)度,以字節(jié)為單位

boolean delete( );?//是否刪除當(dāng)前文件

目錄操作

boolean mkdir( );?//根據(jù)當(dāng)前對(duì)象生成一個(gè)由該對(duì)象指定的路徑

String list( );?//列出當(dāng)前目錄下的文件

下面給出一個(gè)文件操作的實(shí)例:列出目錄D:\\ex\所有的.java文件

import

java.io.*;?//引入java.io包中所有的類

public class FileFilterTest{

public static void main(String args[]){

File dir=new File("d://ex");?//用File

對(duì)象表示一個(gè)目錄

Filter?filter=new?Filter("java");?//生成一個(gè)名為java的過濾器

System.out.println("list java files in directory "+dir);

String files[]=dir.list(filter);?//列出目錄dir下,文件后綴名為java的所有文件

for(int i=0;i

File f=new File(dir,files[i]);?//為目錄dir下的文件或目錄創(chuàng)建一個(gè)File對(duì)象

if(f.isFile())?//如果該對(duì)象為后綴為java的文件,則打印文件名

System.out.println("file "+f);

else

System.out.println("sub directory "+f

);?//如果是目錄則打印目錄名

}

}

}

class Filter implements FilenameFilter{

String extent;

Filter(String extent){

this.extent=extent;}

public boolean accept(File dir,String name){

return

name.endsWith("."+extent);?//返回文件的后綴名

}

}

【文件順序處理】類FileInputStream和FileOutputStream用來進(jìn)行文件I/O處理,由它們所提供的方法可以打開本地主機(jī)上的文件,并進(jìn)行順序的讀/寫。例如,下列的語句段是順序讀取文件名為text的文件里的內(nèi)容,并顯示在控制臺(tái)上面,直到文件結(jié)束為止:FileInputStream

fis;

try{ fis = new FileInputStream( "text" );

System.out.print( "content of text is : ");

int b;

while( (b=fis.read())!=-1?)?//順序讀取文件text里的內(nèi)容并賦值給整型變量b,直到文件結(jié)束     {

System.out.print( (char)b );

}

}catch( FileNotFoundException e ){

System.out.println( e );

}catch( IOException e ){

System.out.println( e );

}

【隨機(jī)訪問文件】

在java中,類RandomAccessFile提供了隨機(jī)訪問文件的方法。類RandomAccessFile的聲明為:

public class RandomAccessFile extends Object

implements?DataInput,

DataOutput接口DataInput中定義的方法:readBoolean(

)、readInt( )、readLine( )、readFully( )等

接口DataOutput中定義的方法:writeChar(

)、writeDouble( )、write( )等

類RandomAccessFile的方法:

◇ 構(gòu)造方法:  RandomAccessFile(String name,String

mode);?//name文件名,mode打開方式("r"只讀"rw"讀寫)

RandomAccessFile(File file,String

mode);?//file是文件對(duì)象

◇ 文件指針的操作

long getFilePointer( );?//用于得到當(dāng)前的文件指針

void seek( long pos );?//用于移動(dòng)文件指針到指定的位置

int skipBytes( int n );?//使文件指針向前移動(dòng)指定的n個(gè)字節(jié)

(五)過濾流

過濾流在讀/寫數(shù)據(jù)的同時(shí)可以對(duì)數(shù)據(jù)進(jìn)行處理,它提供了同步機(jī)制,使得某一時(shí)刻只有一個(gè)線程可以訪問一個(gè)I/O流,以防止多個(gè)線程同時(shí)對(duì)一個(gè)I/O流進(jìn)行操作所帶來的意想不到的結(jié)果。

類FilterInputStream和FilterOutputStream分別作為所有過濾輸入流和輸出流的父類。

為了使用一個(gè)過濾流,必須首先把過濾流連接到某個(gè)輸入/出流上,通常通過在構(gòu)造方法的參數(shù)中指定所要連接的輸入/出流來實(shí)現(xiàn)。

例如:

FilterInputStream( InputStream in );

FilterOutputStream( OutputStream out );

常見的過濾流:

BufferedInputStream和BufferedOutputStream?緩沖流,用于提高輸入/輸出處理的效率

◇ DataInputStream 和

DataOutputStream?不僅能讀/寫數(shù)據(jù)流,而且能讀/寫數(shù)據(jù)基本類型。

LineNumberInputStream?除了提供對(duì)輸入處理的支持外,還可以記錄當(dāng)前的行號(hào)。

PushbackInputStream?提供方法可以把剛讀過的字節(jié)退回到輸入流中,以便重新再讀一遍。

PrintStream?打印流:把Java語言的內(nèi)構(gòu)類型以其字符表示形式送到相應(yīng)的輸出流。

(六)字符流的處理java中提供了處理以16位的Unicode碼表示的字符流的類,即以Reader和Writer為基類派生出的一系列類。

1.Reader和Writer

Reader類是處理所有字符流輸入類的父類、Writer類是處理所有字符流輸出類的父類。

◇ 讀取字符(輸入流)

public int read() throws IOException; //讀取一個(gè)字符,返回值為讀取的字符

public int read(char cbuf[]) throws IOException;

//讀取一系列字符到數(shù)組cbuf[]中

public abstract int read(char cbuf[],int off,int len) throws

IOException; //必須由子類實(shí)現(xiàn)

寫入字符(輸出流)

public void write(int c) throws IOException;

public void write(char cbuf[]) throws IOException;

public abstract void write(char cbuf[],int off,int len) throws

IOException;

public void write(String str) throws IOException;

public void write(String str,int off,int len) throws

IOException;

◇?flush(輸出流);刷空輸出流,并輸出(寫入)所有被緩存的字節(jié)。

◇ 標(biāo)記流(輸入流)

public boolean markSupported();

public

void mark(int readAheadLimit) throws IOException;

public

void reset() throws IOException;

◇ 關(guān)閉流(輸入輸出流)

public abstract void close() throws IOException;

2.InputStreamReader 和

OutputStreamWriter:字節(jié)流和字符流的中介流◇

生成流對(duì)象  public InputStreamReader(InputStream

in);?//InputStreamReader可以把字節(jié)流in轉(zhuǎn)換成字符流

public InputStreamReader(InputStream in,String enc) throws

UnsupportedEncodingException;

public OutputStreamWriter(OutputStream out);

public OutputStreamWriter(OutputStream out,String enc) throws

UnsupportedEncodingException;

◇ 讀入和寫出字符

基本同Reader和Writer。

◇ 獲取當(dāng)前編碼方式

public String?getEncoding();

◇ 關(guān)閉流

public void close() throws IOException;

3.BufferedReader

和 BufferedWriter:◇

生成流對(duì)象

public BufferedReader(Reader in);?//使用缺省的緩沖區(qū)大小

public BufferedReader(Reader in, int

sz);?//sz為緩沖區(qū)的大小

public BufferedWriter(Writer out);

public BufferedWriter(Writer out, int sz);

讀入/寫出字符

除了Reader和Writer中提供的基本的讀寫方法外,增加對(duì)整行字符的處理  public String readLine() throws

IOException;?//讀一行字符

public void newLine() throws

IOException;?//寫一行字符

【例子】從鍵盤接收數(shù)據(jù)輸入:

import

java.io.*;

public class NumberInput{

public static void main(String args[]){

try{?InputStreamReader

ir;

BufferedReader in;

ir=new

InputStreamReader(System.in);?//從鍵盤接收了一個(gè)字符串的輸入,并創(chuàng)建了一個(gè)字符輸入流的對(duì)象

in=new BufferedReader(ir);

String s=in.readLine();//從輸入流in中讀入一行,并將讀取的值賦值給字符串變量s

System.out.println("Input value is: "+s);int

i = Integer.parseInt(s);//轉(zhuǎn)換成int型

i*=2;

System.out.println("Input value changed after doubled:

"+i);

}catch(IOException e)

{System.out.println(e);}

}

}

【注意】在讀取字符流時(shí),如果不是來自于本地的,比如說來自于網(wǎng)絡(luò)上某處的與本地編碼方式不同的機(jī)器,那么我們?cè)跇?gòu)造輸入流時(shí)就不能簡(jiǎn)單地使用本地缺省的編碼方式,否則讀出的字符就不正確;為了正確地讀出異種機(jī)上的字符,我們應(yīng)該使用下述方式構(gòu)造輸入流對(duì)象:

ir = new

InputStreamReader(is, "8859_1");采用ISO

8859_1編碼方式,這是一種映射到ASCII碼的編碼方式,可以在不同平臺(tái)之間正確轉(zhuǎn)換字符。(七)對(duì)象的串行化(Serialization)我們把對(duì)象的這種能記錄自己的狀態(tài)以便將來再生的能力,叫做對(duì)象的持續(xù)性(persistence)。對(duì)象通過寫出描述自己狀態(tài)的數(shù)值來記錄自己,這個(gè)過程叫對(duì)象的串行化(Serialization)。

串行化目的:為java的運(yùn)行環(huán)境提供一組特性,其主要任務(wù)是寫出對(duì)象實(shí)例變量的數(shù)值。

串行化方法:在java.io包中,只有實(shí)現(xiàn)了Serializable類的對(duì)象才可以被串行化。

串行化只能保存的元素:非靜態(tài)成員變量的值,不能保存變量任何修飾符。

transient關(guān)鍵字:暫時(shí)保存的對(duì)象

首先,定義一個(gè)可串行化對(duì)象

public class Student?implements

Serializable{

int id;?//學(xué)號(hào)

String name;?//姓名

int age;?//年齡

String department?//系別

public Student(int id,String name,int age,String

department){

this.id = id;

this.name = name;

this.age = age;

this.department = department;

}

}

其次,構(gòu)造對(duì)象輸入輸出流:在ObjectInputStream中用readObject()方法直接讀取一個(gè)對(duì)象,ObjectOutputStream中用writeObject()方法直接將對(duì)象保存到輸出流中:

Student

stu=new Student(981036,"Liu Ming",18, "CSD");

FileOutputStream fo=new FileOutputStream("data.ser");//保存對(duì)象的狀態(tài)

ObjectOutputStream so=new ObjectOutputStream(fo);

try{so.writeObject(stu);

so.close();

}catch(IOException e )

{System.out.println(e);}

FileInputStream fi=new FileInputStream("data.ser");

ObjectInputStream si=new ObjectInputStream(fi);//恢復(fù)對(duì)象的狀態(tài)

try{stu=(Student)si.readObject();

si.close();

}catch(IOException e )

{System.out.println(e);}

在這個(gè)例子中,我們首先定義一個(gè)類Student,實(shí)現(xiàn)了

Serializable接口,然后通過對(duì)象輸出流的writeObject()方法將Student對(duì)象保存到文件data.ser中。之后,通過對(duì)象輸入流的readObject()方法從文件data.ser中讀出保存下來的Student對(duì)象。

(八)其他常用流:

1.管道流:PipedInputStream、PipedOutputStream

管道輸入流作為一個(gè)通信管道的接收端,管道輸出流作為發(fā)送端。在使用管道之前,管道輸出流和管道輸入流必須進(jìn)行連接。下面有兩種連接的方法:構(gòu)造方法中連接  PipedInputStream(PipedOutputStream src);

PipedOutputStream(PipedInputStream snk);

connect()方法進(jìn)行連接

類PipedInputStream中定義為:

void connect(PipedOutputStream src);

類PipedOutputStream中定義為:

void connect(PipedInputStream snk);

2.內(nèi)存的讀/寫:

ByteArrayInputStream和ByteArrayOutputStream?字節(jié)數(shù)組讀取寫入字節(jié)數(shù)據(jù)

StringBufferInputStream和StringBufferOutputStream字符串緩沖區(qū)中寫入讀取寫入字符數(shù)據(jù)

3.順序輸入流:

SequenceInputStream

把幾個(gè)輸入流順序連接起來。順序輸入流提供了把若干不同的流統(tǒng)一為同一個(gè)流的功能,使得程序變得更加簡(jiǎn)潔。

總結(jié)

以上是生活随笔為你收集整理的java 运行异常处理_Java编程异常处理和I/O流的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。