關(guān)于java.io.EOFException產(chǎn)生的原因以及解決方案
java.io.EOFException產(chǎn)生的原因及解決
異常發(fā)生場(chǎng)景
使用ObjectInputStream類(lèi)往文件中傳入自定義類(lèi)student時(shí)
ObjectInputStream objectInputStream=null; ArrayList<Student> students=null; try { objectInputStream = new ObjectInputStream(new FileInputStream("D:\\桌面\\java38\\javase08\\java08\\1.txt")); students = (ArrayList<Student>) objectInputStream.readObject(); System.out.println("數(shù)據(jù)載入成功"); ? }catch (Exception e) { e.printStackTrace(); System.out.println("數(shù)據(jù)載入失敗"); }
異常產(chǎn)生原因
經(jīng)過(guò)導(dǎo)師查找,終于發(fā)現(xiàn)了OFException產(chǎn)生的原因
ObjectInputStream objectInputStream=null; //idea上顯示null為灰色,說(shuō)明 new ObjectInputStream(new FileInputStream("D:\\桌面\\java38\\javase08\\java08\\1.txt"));返回值為null,即文件"D:\\桌面\\java38\\javase08\\java08\\1.txt"為空 objectInputStream = new ObjectInputStream(new FileInputStream("D:\\桌面\\java38\\javase08\\java08\\1.txt"));
objectInputStream為空值,則不能使用objectInputStream.close();如果使用會(huì)產(chǎn)生并發(fā)癥 java.lang.NullPointerException(空指針異常)
異常解決
ObjectInputStream objectInputStream=null; ArrayList<Student> students=null; try { objectInputStream = new ObjectInputStream(new FileInputStream("D:\\桌面\\java38\\javase08\\java08\\1.txt")); students = (ArrayList<Student>) objectInputStream.readObject(); System.out.println("數(shù)據(jù)載入成功"); ? } catch (EOFException e) { students = new ArrayList<>(); ? }catch (Exception e) { e.printStackTrace(); System.out.println("數(shù)據(jù)載入失敗"); } finally { if(objectInputStream != null) { objectInputStream.close(); }
在finally語(yǔ)句內(nèi)加上判斷,不等于空值才關(guān)閉
捕獲EOFException,但不打印錯(cuò)誤,為students,new一個(gè)新的集合(本來(lái)這里也有一個(gè)會(huì)出bug的地方,但是被我之前就給students賦了null值,(ArrayList<Student> students=null;)所以catch里new一個(gè)新的對(duì)象)
如果不為空,則
students = (ArrayList<Student>) objectInputStream.readObject();
正常執(zhí)行,不報(bào)錯(cuò)誤~
總結(jié)
java.io.EOFException不是一個(gè)常出現(xiàn)的問(wèn)題,而且并發(fā)癥 java.lang.NullPointerException(空指針異常),只有objectInputStream.readObject();接收為null且1.txt文件為空時(shí)才會(huì)出現(xiàn)
EOFException只需要捕獲,該bug在本場(chǎng)景下被捕獲后程序就不會(huì)終止了,甚至不處理也行。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot使用swagger生成api接口文檔的方法詳解
在之前的文章中,使用mybatis-plus生成了對(duì)應(yīng)的包,在此基礎(chǔ)上,我們針對(duì)項(xiàng)目的api接口,添加swagger配置和注解,生成swagger接口文檔,需要的可以了解一下2022-10-10Springboot項(xiàng)目引入druid安裝部署使用教程
這篇文章主要介紹了Springboot項(xiàng)目引入druid安裝部署使用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01SpringBoot基于Mybatis攔截器和JSqlParser實(shí)現(xiàn)數(shù)據(jù)隔離
本文將介紹如何在 Spring Boot 項(xiàng)目中利用Mybatis的強(qiáng)大攔截器機(jī)制結(jié)合JSqlParser,一個(gè)功能豐富的 SQL 解析器,來(lái)輕松實(shí)現(xiàn)數(shù)據(jù)隔離的目標(biāo),本文根據(jù)示例展示如何根據(jù)當(dāng)前的運(yùn)行環(huán)境來(lái)實(shí)現(xiàn)數(shù)據(jù)隔離,需要的朋友可以參考下2024-04-04JpaRepository?實(shí)現(xiàn)簡(jiǎn)單條件查詢(xún)
這篇文章主要介紹了JpaRepository?實(shí)現(xiàn)簡(jiǎn)單條件查詢(xún),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11SpringBoot日志文件的實(shí)現(xiàn)示例
日志是程序中的重要組成部分,使用日志可以快速的發(fā)現(xiàn)和定位問(wèn)題,本文主要介紹了SpringBoot日志文件的實(shí)現(xiàn)示例,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08java 基礎(chǔ)教程之多線程詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了java 基礎(chǔ)教程之多線程詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,線程的基本屬性、如何創(chuàng)建線程、線程的狀態(tài)切換以及線程通信,需要的朋友可以參考下2017-03-03