場景:很多的時候需要做到跳出多重循環,而在Java中雖然后goto關鍵字,但是是保留字,並沒有啟用。而在處理分支結構的if...else,switch...case,好像都達不到想要的效果。
作為終止當前代碼的return並不能完成業務需求,能用到的只有break,但是break只能跳出當前的循環。
代碼示例:break
private static void testBreak() { for (int i = 0; i < 3; i++) { for (int j = 0; j < 5; j++) { System.out.println("testBreak==j==" + j); if (j == 2) break; } System.out.println("testBreak==i====>>>" + i); } System.out.println("testBreak======>>>END"); }
結果:
testBreak==j==0 testBreak==j==1 testBreak==j==2 testBreak==i====>>>0 testBreak==j==0 testBreak==j==1 testBreak==j==2 testBreak==i====>>>1 testBreak==j==0 testBreak==j==1 testBreak==j==2 testBreak==i====>>>2 testBreak======>>>END
結論:所有的執行到 j==2 的時候都會終止但是只能跳出當前循環。
解決方案一:繼續使用break,但是在添加一個flag作為判斷條件,每次判斷條件的時候都會判斷循環和flag.
代碼:
private static void outloopByBreak() { boolean flag = true; for (int i = 0; i < 3 && flag; i++) { for (int j = 0; j < 5; j++) { System.out.println("outloopByBreak==j==" + j); if (j == 2) { flag = false; break; } } System.out.println("outloopByBreak==i====>>>" + i); } System.out.println("outloopByBreak======>>>END"); }
結果:
outloopByBreak==j==0 outloopByBreak==j==1 outloopByBreak==j==2 outloopByBreak==i====>>>0 outloopByBreak======>>>END
結論:能解決跳出循環的問題,但是是會在內部循環的完成之后繼續往下執行,知道下次判斷才會跳出循環。
解決方案二:Java中break有一種用法可以做到類似goto的效果,在需要跳出的循環之前加一個標志之后break 標志;可以做到跳出循環(推薦使用)。
代碼:
private static void outloopByBreakLikeGoto() { flag: for (int i = 0; i < 3; i++) { for (int j = 0; j < 5; j++) { System.out.println("outloopByBreakLikeGoto==j==" + j); if (j == 2) break flag; } System.out.println("outloopByBreakLikeGoto==i====>>>" + i); } System.out.println("outloopByBreakLikeGoto======>>>END"); }
結果:
outloopByBreakLikeGoto==j==0 outloopByBreakLikeGoto==j==1 outloopByBreakLikeGoto==j==2 outloopByBreakLikeGoto======>>>END
結論:做到了類似goto的效果
解決方案三:try...catch方式也能做到跳出多重循環的效果
代碼:
private static void outloopByTryCatch() { try { for (int i = 0; i < 3; i++) { for (int j = 0; j < 5; j++) { System.out.println("outloopByTryCatch==j==" + j); if (j == 2) throw new Exception(); } System.out.println("outloopByTryCatch==i====>>>" + i); } } catch (Exception e) { System.out.println("====>>outloopByTryCatch跳出"); } System.out.println("outloopByTryCatch======>>>END"); }
結果:
outloopByTryCatch==j==0 outloopByTryCatch==j==1 outloopByTryCatch==j==2 ====>>outloopByTryCatch跳出 outloopByTryCatch======>>>END
結論:用拋異常的方式跳出,但是不推薦