1. 程式人生 > >java開發中遇到的Bug整理

java開發中遇到的Bug整理

原因:不能熱交換到執行虛擬機器,一些程式碼變化不能熱交換到執行虛擬機器,如更改名稱或介紹的方法錯誤執行程式碼。

解決方法:增加、刪除類檔案或者在一個類中增加、刪除方法時,是不能夠熱部署到服務上的。這時候需要停止伺服器(Tomcat等等)重新部署後再啟動,就不會出現上面的提示了。

3.org.apache.jasper.JasperException: java.lang.ClassCastException:org.apache.catalina.util.DefaultAnnotationProcessor cannot be cast to org.apache.AnnotationProcessor 


at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522) 
 at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:356) 

原因:修改了tomcat裡的context.xml檔案,在context 元素下新增<Loader delegate="true" />  

4.POI匯出大資料問題

第一步:HSSF匯出.xls檔案時,行數不能超過65535行。改用XSSF匯出.xlsx檔案時行數可達100萬條。但是在匯出20萬條資料時就很時間了。並且會報錯:java.lang.OutOfMemoryError: Java heap space  

http://blog.sina.com.cn/s/blog_701c951f0100n1sp.html中的第二種情況發生這種問題的原因是java虛擬機器建立的物件太多,在進行垃圾回收之間,虛擬機器分配的到堆記憶體空間已經用滿了,與Heap space有關。解決這類問題有兩種思路:
1. 檢查程式,看是否有死迴圈或不必要地重複建立大量物件。找到原因後,修改程式和演算法。
我以前寫一個使用K-Means文字聚類演算法對幾萬條文字記錄(每條記錄的特徵向量大約10來個)進行文字聚類時,由於程式細節上有問題,就導致了Java heap space的記憶體溢位問題,後來通過修改程式得到了解決。
2. 增加Java虛擬機器中Xms(初始堆大小)和Xmx(最大堆大小)引數的大小。如:set JAVA_OPTS= -Xms256m -Xmx1024m

第二步:按照上面的方法將JVM的引數改為:-Xms256m -Xmx1024m 又報了下面的問題

java.lang.OutOfMemoryError: GC overheadlimit exceeded  這個是JDK6新添的錯誤型別。是發生在GC佔用大量時間為釋放很小空間的時候發生的,是一種保護機制。解決方案是,關閉該功能,使用—— -XX:-UseGCOverheadLimit

第三步:關閉該功能,使用—— -XX:-UseGCOverheadLimit 方式

還是報錯:java.lang.OutOfMemoryError: Java heap space  效果不行  

然後將引數調整為-Xms1024m -Xmx1024m   其中"-Xms128M"為最小記憶體,"-Xmx256M"為最大記憶體。 這樣的效果不好。需要想其他方法

第四步:測試發現改用XSSF匯出.xlsx檔案時行數可達100萬條,但是匯出10萬條只需要15秒,當超過12萬時就會出現了記憶體溢位。修改jvm的引數效果不好,現在只有想其他方法

第五步:改用SXSSF模擬資料匯出時100萬條只要16-18秒,50萬隻要9秒。但是缺點就是隻能匯出xlsx檔案,??但是我嘗試匯出xls檔案也可以。可能我用的是3.11版本比較高了已經支援xls了吧。原因:可以到處xls檔案,但是他實質還是xlsx檔案。Xls檔案只能有65535行。所有本質上還是不能到處大資料的xls檔案。因為將這樣一個檔案匯入時會被認為是xlsx檔案。

POI匯入大資料問題

首先匯入一個11M的xls檔案,裡面含有50萬條資料。匯入就報錯了,Struts中檔案上傳不能超多2M

修改Struts的常量配置檔案

         <!--修改Struts2的檔案上傳限制大小 -->

         <constantname="struts.multipart.maxSize" value="20000000"/>

但是還是出現問題:記憶體溢位 50萬條太大了

ognl.MethodFailedException: Method"importExcel" failed for [email protected] [java.lang.OutOfMemoryError: Javaheap space]

實際測試匯入10萬條大小為2.3M沒有問題不到一分鐘時間.超過15萬條開始出現記憶體溢位這個匯出一樣的大小就會造成記憶體溢位並且這裡的第一種方案是解決不了的,只可能考慮第二種方案壓縮然後解壓的方式

分幾批匯入資料庫,總共為75萬條資料.

select count(*) from table_ 查詢總記錄數

然後匯出75萬資料時還是報錯ognl.MethodFailedException: Method"exportExcel" failed for [email protected] [java.lang.OutOfMemoryError:Java heap space]記憶體溢位.所以大資料匯出還是得用第二種方案來解決

先用DELETE FROM USER WHERE 1=1  LIMIT 100000; 刪除表中前10萬的資料到60萬行.還是報錯,到55萬行時就可以,時間上只要不到一分鐘.

通過第二種方案實現大資料匯出:多個excel檔案壓縮檔案

匯出多個檔案excel時資料量達到60萬時還是會OOM,因為一次性讀取那麼大的資料量到記憶體可能會溢位的,讀取50萬的時候還好,所以還是必須分批讀出來然後分批寫到excel檔案中去,所以現在就是首先要分批來做,以5萬為單位,每次向資料庫中讀取5萬的資料寫到excel檔案中去.

分頁查詢出資料庫中的值

SELECT* FROM USER LIMIT 0,20;

SELECT* FROM USER LIMIT 21,40; 就是分頁處理的查詢

分頁查詢方式匯出60萬條,沒有檔案,然後將多個檔案壓縮為Zip檔案,再刪除原始檔.  最大150萬沒有問題

@Test
	/**
	 * 將使用者列表分頁匯出多個excel檔案,然後壓縮為zip檔案,然後將原始檔刪除(完整版)
	 */
	public void doZipExcel() {// 這樣是OK 現在就是要將多個excel檔案壓縮就可以了----
		// 以當前時間為檔名稱
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss");
		String path = sdf.format(new Date());
		// 得到伺服器地址路徑
		// String serverPath = ServletActionContext.getServletContext()
		// .getRealPath("upload/test/");
		String serverPath = new String(
				"D:\\apache-tomcat-6.0.39\\webapps\\itcastTax\\upload\\test\\");
		// 在伺服器端建立資料夾
		File file = new File(serverPath + path);
		if (!file.exists()) {
			file.mkdir();
		}
		// 從容器中拿到userService物件
		UserService ts = (UserService) ctx.getBean("userService");
		// 查詢總記錄數
		int resultCounts = ts.findCounts();
		// 然後分頁查詢出資料來
		// 每次設定匯出數量
		int NUM = 100000;
		// 得出匯出的excel檔案數
		int excelNumbers = 0;
		if (resultCounts != 0) {
			if (resultCounts % NUM == 0) {
				excelNumbers = resultCounts / NUM;
			} else {
				excelNumbers = resultCounts / NUM + 1;
			}
		} else {
			excelNumbers = 1;
		}
		System.out.println(excelNumbers);
		for (int j = 0; j < excelNumbers; j++) {
			List<User> userList1 = null;
			// 切取每5000為一個匯出單位,儲存一個檔案
			// 對不足5000做處理;
			if (resultCounts != 0) {

				userList1 = ts.findCount(NUM, (j + 1));

			}
			System.out.println(userList1.size());
			// 2、匯出
			try {
				// 1、建立工作簿
				Workbook workbook = new SXSSFWorkbook(500);
				// 1.1、建立合併單元格物件
				CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 0,
						0, 6);// 起始行號,結束行號,起始列號,結束列號

				// 1.2、頭標題樣式
				CellStyle style1 = createCellStyle(workbook, (short) 16);

				// 1.3、列標題樣式
				CellStyle style2 = createCellStyle(workbook, (short) 13);

				// 2、建立工作表
				Sheet sheet = workbook.createSheet("使用者列表");
				// 2.1、載入合併單元格物件
				sheet.addMergedRegion(cellRangeAddress);
				// 設定預設列寬
				sheet.setDefaultColumnWidth(12);

				// 3、建立行
				// 3.1、建立頭標題行;並且設定頭標題
				Row row1 = sheet.createRow(0);
				Cell cell1 = row1.createCell(0);
				// 載入單元格樣式
				cell1.setCellStyle(style1);
				cell1.setCellValue("使用者列表");

				// 3.2、建立列標題行;並且設定列標題
				Row row2 = sheet.createRow(1);
				String[] titles = { "使用者名稱", "帳號", "所屬部門", "性別", "手機號碼", "電子郵箱",
						"生日" };
				for (int i = 0; i < titles.length; i++) {
					Cell cell2 = row2.createCell(i);
					// 載入單元格樣式
					cell2.setCellStyle(style2);
					cell2.setCellValue(titles[i]);
				}

				// 4、操作單元格;將使用者列表寫入excel
				if (userList1 != null) {
					for (int x = 0; x < userList1.size(); x++) {
						Row row = sheet.createRow(x + 2);
						Cell cell11 = row.createCell(0);
						cell11.setCellValue(userList1.get(x).getName());
						Cell cell12 = row.createCell(1);
						cell12.setCellValue(userList1.get(x).getAccount());
						Cell cell13 = row.createCell(2);
						cell13.setCellValue(userList1.get(x).getDept());
						Cell cell14 = row.createCell(3);
						cell14.setCellValue(userList1.get(x).isGender() ? "男"
								: "女");
						Cell cell15 = row.createCell(4);
						cell15.setCellValue(userList1.get(x).getMobile());
						Cell cell16 = row.createCell(5);
						cell16.setCellValue(userList1.get(x).getEmail());
						Cell cell17 = row.createCell(6);
						cell17.setCellValue(userList1.get(x).getBirthday());
					}
				}
				// 5、輸出
				FileOutputStream outputStream = new FileOutputStream(new File(
						serverPath + path + "\\" + j + "使用者列表大資料.xlsx"));
				workbook.write(outputStream);
				workbook.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		// 得到匯出來的excel檔案陣列
		File[] files = file.listFiles();
		// List<String> filesList = new ArrayList<String>();
		// if (files != null) {
		// for (File file2 : files) {
		// filesList.add(file2.getAbsolutePath());
		// System.out.println(file2.getAbsolutePath());
		// }
		// }
		// 通過工具類將檔案陣列壓縮為zip檔案
		String fileZipName = serverPath + "使用者列表大資料" + path + ".zip";
		ZipFileUtil.compressFiles2Zip(files, fileZipName);
		// 將資料夾刪除
		System.out.println(DeleteFolder(file.getAbsolutePath()));
	}

	/**
	 * 建立單元格樣式
	 * 
	 * @param workbook
	 *            工作簿
	 * @param fontSize
	 *            字型大小
	 * @return 單元格樣式
	 */
	private static CellStyle createCellStyle(Workbook workbook, short fontSize) {
		CellStyle style = workbook.createCellStyle();
		style.setAlignment(CellStyle.ALIGN_CENTER);// 水平居中
		style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);// 垂直居中
		// 建立字型
		Font font = workbook.createFont();
		font.setBoldweight(Font.BOLDWEIGHT_BOLD);// 加粗字型
		font.setFontHeightInPoints(fontSize);
		// 載入字型
		style.setFont(font);
		return style;
	}

	/**
	 * 根據路徑刪除指定的目錄或檔案,無論存在與否
	 * 
	 * @param sPath
	 *            要刪除的目錄或檔案
	 * @return 刪除成功返回 true,否則返回 false。
	 */
	public boolean DeleteFolder(String sPath) {
		boolean flag = false;
		File file = new File(sPath);
		// 判斷目錄或檔案是否存在
		if (!file.exists()) { // 不存在返回 false
			return flag;
		} else {
			// 判斷是否為檔案
			if (file.isFile()) { // 為檔案時呼叫刪除檔案方法
				return deleteFile(sPath);
			} else { // 為目錄時呼叫刪除目錄方法
				return deleteDirectory(sPath);
			}
		}
	}

	/**
	 * 刪除單個檔案
	 * 
	 * @param sPath
	 *            被刪除檔案的檔名
	 * @return 單個檔案刪除成功返回true,否則返回false
	 */
	public boolean deleteFile(String sPath) {
		boolean flag = false;
		File file = new File(sPath);
		// 路徑為檔案且不為空則進行刪除
		if (file.isFile() && file.exists()) {
			file.delete();
			flag = true;
		}
		return flag;
	}

	/**
	 * 刪除目錄(資料夾)以及目錄下的檔案
	 * 
	 * @param sPath
	 *            被刪除目錄的檔案路徑
	 * @return 目錄刪除成功返回true,否則返回false
	 */
	public boolean deleteDirectory(String sPath) {
		// 如果sPath不以檔案分隔符結尾,自動新增檔案分隔符
		if (!sPath.endsWith(File.separator)) {
			sPath = sPath + File.separator;
		}
		System.out.println(File.separator);
		File dirFile = new File(sPath);
		// 如果dir對應的檔案不存在,或者不是一個目錄,則退出
		if (!dirFile.exists() || !dirFile.isDirectory()) {
			return false;
		}
		boolean flag = true;
		// 刪除資料夾下的所有檔案(包括子目錄)
		File[] files = dirFile.listFiles();
		for (int i = 0; i < files.length; i++) {
			// 刪除子檔案
			if (files[i].isFile()) {
				flag = deleteFile(files[i].getAbsolutePath());
				if (!flag)
					break;
			} // 刪除子目錄
			else {
				flag = deleteDirectory(files[i].getAbsolutePath());
				if (!flag)
					break;
			}
		}
		if (!flag)
			return false;
		// 刪除當前目錄
		if (dirFile.delete()) {
			return true;
		} else {
			return false;
		}
	}

5.SQL [delete fromrole where role_id=?]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException:Could not execute JDBC batch update

原因:這個和資料庫還是有區別

 資料庫外來鍵檢查。一般情況是,當你刪除父鍵時,不讓刪除,因為有子鍵引用這個父建id,但是hibernate的級聯不一樣。刪除子鍵也不行 ,所以取消級聯

6.2016-6-13 23:50:57org.apache.catalina.core.StandardWrapperValve invoke

嚴重: Servlet.service() for servlet jsp threw exception
org.apache.jasper.JasperException: Unable to compile class for JSP:
An error occurred at line: 6 in the generated java file
Only a type can be imported. com.baidu.ueditor.ActionEnter resolves to apackage
An error occurred at line: 12 in the jsp file: /ueditor/jsp/controller.jsp
ActionEnter cannot be resolved to a type
9:
10: String rootPath = application.getRealPath( "/" );
11:
12: out.write( new ActionEnter( request, rootPath ).exec() );
13:
14: %>
Stacktrace:
at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:92)

同出現此問題,我是因為直接把ueditor/jsp/lib下的包匯入工程的.
將該包全部拷到web-inf/lib下匯入解決此問題



相關推薦

java開發遇到的Bug整理

原因:不能熱交換到執行虛擬機器,一些程式碼變化不能熱交換到執行虛擬機器,如更改名稱或介紹的方法錯誤執行程式碼。 解決方法:增加、刪除類檔案或者在一個類中增加、刪除方法時,是不能夠熱部署到服務上的。這時候需要停止伺服器(Tomcat等等)重新部署後再啟動,就不會出現上面的提示了。 3.org.apache.j

java開發遇到的錯誤(bug)及解決方案

遇到同樣的錯誤,難題,可再一再二,卻不可再三再四。所以對自己程式設計,開發過程中遇到的難題,bug,錯誤,當時是整麼解決的做一下記錄,我覺得是很有必要: 1.javac編譯.java類檔案時,報: 錯誤: 編碼GBK的不可對映字元, 解決方案是:將  Javac xxx.jav

Java專案開發一些BUG的總結

1,JVM Bind 2, hbm主鍵生成策略錯誤: Struts Problem Report Struts has detected an unhandled exception: Messages: ids for this class must be

Java開發常用jar包整理及使用

本文整理了我自己在Java開發中常用的jar包以及常用的API記錄。 <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> <dependency>

轉載----編寫高質量代碼:改善Java程序的151個建議(第1章:JAVA開發通用的方法和準則___建議1~5)

ase 重載方法 name 原理 .get tin stat eas 容易 閱讀目錄 建議1:不要在常量和變量中出現易混淆的字母 建議2:莫讓常量蛻變成變量    建議3:三元操作符的類型務必一致   建議4:避免帶有變長參數的方法重載 建議5:別讓null值和空值威

java開發涉及到的調優

padding 任務 頻率 實例化 dst 最好 ack log wid JVM內存的調優 默認的Java虛擬機的大小比較小,在對大數據進行處理時java就會報錯:java.lang.OutOfMemoryError。 1. Heap設定與垃圾回收Java Heap分為3個

JAVA開發遇到的異常總結

原因 counter ping 無法使用 kdt 訪問類 tin 響應時間 lang 最常見的五種異常:必會,面試題:  算術異常類:ArithmeticExecption   空指針異常類:NullPointerException   類型強制轉換異常:ClassCast

Java開發JDBC連接數據庫代碼和步驟

found 獲得 java虛擬機 ace 失敗 user lang username host   JDBC連接數據庫:創建一個以JDBC連接數據庫的程序,包含7個步驟: 1、加載JDBC驅動程序:   在連接數據庫之前,首先要加載想要連接的數據庫的驅動到JVM(Ja

Java 開發的對象拷貝

通過反射 log exc see void 沒有 ima 對比 tde 前言 在 Java 開發中,很多時候需要將兩個屬性基本相同的對象進行屬性復制,比如 DO 轉 VO等等。 本文主要介紹自己實現的簡易拷貝工具類與 Spring 提供的屬性拷貝的對比。 Spring

Java 開發常用的網站地址

圖片 編程語言排行榜 文件 get 集成 Go HA 修改 多少 一、前言 在日常的開發中,通常需要訪問或者設置不同的網站來獲取需要的數據,不如我們都知道 Linux 系統版本比較多(例如:Ubuntu、CentOS、RedHat 和 SUSE 等),這些軟件通常比較龐大,

java開發使用枚舉表述數據字典

his 總結 枚舉 每一個 col 限制 系列 UC 類型 一.用枚舉表述數據字典 1.代碼: package com.inspire.jdk.caculate; /** * Created by yaming * 用枚舉表述常量數據字段 */ public en

java開發避免NullPointerException

urn cti str 之前 isn emp bsp 使用 tco 空指針異常讓人厭惡,恐怕是實際應用中出現次數最多的異常了,下面是如何避免NullPointerException出現的技巧 使用某個對象前,最好清楚他們是否可能為null,如果不能確定,就利用if語句

java開發的重中之重-------mysql(基礎篇)

介紹:   mysql是目前世界上最流行的關係型資料庫,在國內大的網際網路公司都在使用mysql資料庫,mysql經常被我們這樣概述,“mysql是輕量級關係型資料庫”,其實輕量級並不是說mysql是中小型資料庫,在專案開發中,儲存資料的量往往是一個架構問題,如果配合架構,mysql也是可以儲存海

Java開發各類物件(BO DO VO DTO PO)

BO:Business Object,業務物件。主要是承載業務資料的實體。處理業務邏輯的時候使用,資料結構也是針對業務邏輯建立的。 PO:persistence Object,持久化物件。資料最終要儲存,無論以何種形式儲存,都必須要持久化。加入使用關係資料庫儲存,一個PO對應一條資料庫的記錄,或者

Java開發,通過sql來實現過濾以及分頁

  我們通過一個需求來引入問題。 首先,簡單介紹一下需求:實現一個下圖的頁面,包含了過濾以及分頁。資料是後臺資料庫獲得到的。 那麼關於如何實現過濾以及分頁,考慮到通過前臺實現或者後臺實現,我們不妨來分析一下兩種方法。 首先,前臺實現:無非就是後臺獲取所有的list,傳

Java開發崗位面試題整理

線程數 本地 簡單 線程間通信 syn 低耦合 刪除 不同方法 ola 一、Java基礎 String類為什麽是final的 HashMap的源碼,實現原理,底層結構。 說說你知道的幾個Java集合類:list、set、queue、map實現類。 描述一下A

Java開發4大常用工具!

在現如今的網際網路時代裡,Java無疑是一種極為流行的開發語言,無論是程式界還是整個網際網路行業勢必帶來很大的影響。不管是人才需求還是薪資水平上,Java的發展前景都是很樂觀的。關於Java的一些常用的工具,也是需要我們不斷去掌握和了解的。下面跟著師一起來了解下Java的4大常用工具吧!

Java架構-Java開發的一些小技巧

一、 Java獲取URL地址中傳遞的引數 二、獲取請求的URL地址 三、獲取請求的IP地址 四:判斷字串是否能夠轉換成指定格式的日期 希望此文能幫到大家的同時,也聽聽大家的觀點。歡迎留言討論,加關注,分享你的高見!持續更新! 我本人邀約各大BATJ

基於spring框架的java開發的異常處理

在springmvc框架的中異常處理的方式有兩種: 1,在控制器中使用@ExceptionHandler(xxxException.class)註解修飾一個方法,該註解能夠處理通一個控制器類中的丟擲的xxxExcepiton異常。 使用控制器通知註解@ControllerAdvice

8u111-jdk-alpine在java開發的NullPointerException錯誤解決方案

問題描述 在部署一個驗證碼服務的容器服務時遇到了一個空指標錯誤,錯誤程式碼為: java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion(FontConfiguration.jav