最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot的異常處理流程是什么樣的?

 更新時間:2021年06月11日 09:50:00   作者:star_chao  
今天給大家?guī)淼氖荍ava的相關(guān)知識,文章圍繞著SpringBoot的異常處理流程展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下

一、默認(rèn)異常處理機(jī)制

默認(rèn)情況下,SpringBoot 提供 /error 請求,來處理所有異常的。

1.瀏覽器客戶端,請求頭里的屬性是Accept:text/html。表明它想要一個html類型的文本數(shù)據(jù)。因此返回的錯誤視圖以HTML格式呈現(xiàn),也就是響應(yīng)一個“ whitelabel”錯誤視圖。

2.如果是其他客戶端,請求頭里的屬性是Accept:/,默認(rèn)響應(yīng)一個json數(shù)據(jù) 。

image.png 

二、異常處理流程

介紹異常處理流程前,要先認(rèn)識HandlerExceptionResolver處理器異常解析器接口,可以將異常映射到相應(yīng)的統(tǒng)一錯誤界面,從而顯示用戶友好的界面(而不是給用戶看到具體的錯誤信息)

public interface HandlerExceptionResolver {
    //解析處理異常
	ModelAndView resolveException(
        HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);
    
}

DispatcherServlet初始化時,已經(jīng)把所有的HandlerExceptionResolver處理器異常解析器接口的實(shí)現(xiàn)類放到下面的集合里了

public class DispatcherServlet extends FrameworkServlet {
    //異常解析器集合
	private List<HandlerExceptionResolver> handlerExceptionResolvers;
}

image.png

從上圖可以看出該集合里有DefaultErrorAttributes;還有HandlerExceptionResolverComposite處理器異常解析器組合,這里面包含了三個能真正處理異常的解析器,分別是ExceptionHandlerExceptionResolverResponseStatusExceptionResolver、DefaultHandlerExceptionResolver。下面會介紹他們幾個分別用于處理什么異常。

閱讀doDispatch()方法的源碼可以看出,Spring MVC對整個doDispatch()方法用了嵌套的try-catch語句

  • 內(nèi)層的try-catch用于捕獲HandlerMapping進(jìn)行映射查找HandlerExecutionChain以及HandlerAdapter執(zhí)行具體Handler時的處理異常,并將異常傳入到processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException)方法中。外層try-catch用于捕獲渲染視圖時的異常。
  • 通過兩層嵌套的try-catch,SpringMVC就能夠捕獲到三大組件在處理用戶請求時的異常,通過這樣的方法能夠很方便的實(shí)現(xiàn)統(tǒng)一的異常處理。
//處理分發(fā)結(jié)果
private void processDispatchResult(HttpServletRequest request, HttpServletResponse response,
                                   HandlerExecutionChain mappedHandler, ModelAndView mv, Exception exception) throws Exception {
    
    //判斷HandlerMapping、HandlerAdapter處理時的異常是否為空
    if (exception != null) {
        Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
        //異常不為空,處理異常,進(jìn)行異常視圖的獲取
        mv = processHandlerException(request, response, handler, exception);
    }

    
    //只要存在mv就進(jìn)行視圖渲染
    if (mv != null && !mv.wasCleared()) {
        //不管視圖是正常視圖還是異常視圖,均進(jìn)入視圖渲染流程
        render(mv, request, response);
        if (errorView) {
            WebUtils.clearErrorRequestAttributes(request);
        }
    }
 	...略
    ...略
   	...略
}

從上面代碼可以看出,當(dāng)出現(xiàn)異常時會進(jìn)入processHandlerException()方法進(jìn)行異常視圖的獲取,處理完成后返回是ModelAndView對象。接下來不管視圖是正常視圖還是異常視圖,只要ModelAndView不為空,均進(jìn)入視圖渲染流程。下面是如何進(jìn)行進(jìn)行異常視圖的獲取的代碼。

//處理異常,進(jìn)行異常視圖的獲取
protected ModelAndView processHandlerException(HttpServletRequest request, HttpServletResponse response,
                                               Object handler, Exception ex) throws Exception {

    // Check registered HandlerExceptionResolvers...
    ModelAndView exMv = null;
    //遍歷所有的處理器異常解析器handlerExceptionResolvers,看誰能夠處理當(dāng)前異常
    for (HandlerExceptionResolver handlerExceptionResolver : this.handlerExceptionResolvers) {
        //解析當(dāng)前異常
        exMv = handlerExceptionResolver.resolveException(request, response, handler, ex);
  
        if (exMv != null) {
            //ModelAndView 不為空時,異常視圖獲取成功,跳出方法,進(jìn)行異常視圖渲染。
            break;
        }
    }
   
    ...略
    ...略
    ...略
   //所有處理器異常解析器都不能處理該異常,拋出異常
   throw ex;
}

遍歷所有的處理器異常解析器handlerExceptionResolvers,看誰能夠處理當(dāng)前異常

image.png 

  • DefaultErrorAttributes先來處理異常。把異常信息保存到request域,并且返回null,并不能真正解析。
  • HandlerExceptionResolverComposite會遍歷它包含的三個異常解析器處理異常
  • ExceptionHandlerExceptionResolver處理器異常解析器支持@ControllerAdvice+@ExceptionHandler處理全局異常
  • ResponseStatusExceptionResolver處理器異常解析器支持@ResponseStatus+自定義異常
  • DefaultHandlerExceptionResolver 處理器異常解析器支持Spring底層的異常

當(dāng)沒有任何異常解析器能夠處理異常,異常就會被拋出,最終Tomcat會發(fā)送 /error 請求,映射到底層的BasicErrorController進(jìn)入默認(rèn)的異常處理機(jī)制。

總結(jié):

當(dāng)發(fā)生異常時,會被catch。遍歷所有的處理器異常解析器,看誰能夠解析。如果你使用了@ControllerAdvice+@ExceptionHandler配置了全局異常處理,并指定了錯誤視圖,那么該異常會被處理,然后進(jìn)入視圖渲染流程。如果該異常沒能夠被任何處理器異常解析器處理,就會拋出異常,由Tomcat發(fā)送/error請求,進(jìn)入默認(rèn)的異常處理機(jī)制,也就是開頭說的,沒有配置錯誤狀態(tài)碼頁面,則返回默認(rèn)我們常見的默認(rèn)錯誤頁。

訪問的是不存在的路徑,此時不會發(fā)生異常,經(jīng)過處理器映射,處理器適配調(diào)用仍然返回的是空的ModelAndView,所以無法進(jìn)行視圖渲染。Tomcat仍會發(fā)送 /error請求,進(jìn)入默認(rèn)的異常處理機(jī)制

三、默認(rèn)的異常處理機(jī)制

要想弄懂錯誤處理原理,首先得看**ErrorMvcAutoConfiguration:這是錯誤處理的自動配置類**,給容器中添加了下面幾個非常重要的組件。

  • ErrorPageCustomizer
  • BasicErrorController
  • DefaultErrorViewResolver
  • DefaultErrorAttributes

首先我們看ErrorPageCustomizer 組件,此組件是一個靜態(tài)內(nèi)部類,位于ErrorMvcAutoConfiguration內(nèi)。它實(shí)現(xiàn)了ErrorPageRegistrar接口,該接口提供了可以用來注冊ErrorPage的方法。官方將ErrorPage 描述為:簡單的服務(wù)器獨(dú)立的錯誤頁面抽象,大致相當(dāng)于web.xml中傳統(tǒng)的元素<error-page>。ErrorPage里包含了狀態(tài)碼、異常、和錯誤控制器映射路徑(server.error.path=/error)。也就是說當(dāng)發(fā)生了異常,而且所有的處理器異常解析器都處理不了該異常,Tomcat就會發(fā)送/error請求映射到BasicErrorController。

static class ErrorPageCustomizer implements ErrorPageRegistrar, Ordered {
    //關(guān)于服務(wù)器的一些配置,如端口號,編碼方式等。在這里主要關(guān)注server.error.path 
    private final ServerProperties properties;

    private final DispatcherServletPath dispatcherServletPath;

    protected ErrorPageCustomizer(ServerProperties properties, DispatcherServletPath dispatcherServletPath) {
        this.properties = properties;
        this.dispatcherServletPath = dispatcherServletPath;
    }

    //注冊錯誤頁面
    @Override
    public void registerErrorPages(ErrorPageRegistry errorPageRegistry) {
        //ErrorPage里包含了狀態(tài)碼、異常、和錯誤控制器映射路徑
        ErrorPage errorPage = new ErrorPage(
            //this.properties.getError().getPath()獲取的就是server.error.path=/error(默認(rèn))
            this.dispatcherServletPath.getRelativePath(this.properties.getError().getPath()));
        //注冊ErrorPage
        errorPageRegistry.addErrorPages(errorPage);
    }
}
====================DispatcherServletPath接口=================================
public interface DispatcherServletPath {   
    default String getRelativePath(String path) {
        String prefix = getPrefix();
        if (!path.startsWith("/")) {
            path = "/" + path;
        }
        return prefix + path;
    }
}

下面介紹的就是BasicErrorController。它里面有兩個重要的方法,正好對象開頭說的默認(rèn)處理機(jī)制。方法一:如果是瀏覽器請求,則返回HTML響應(yīng)數(shù)據(jù)text/html,方法二:如果是其他客戶端請求,則返回JSON響應(yīng)數(shù)據(jù)。

@Controller
//server.error.path 為空則用error.path, 再為空,再用/error
@RequestMapping("${server.error.path:${error.path:/error}}")
public class BasicErrorController extends AbstractErrorController {
    
     //1、產(chǎn)生html類型的數(shù)據(jù);瀏覽器客戶端發(fā)送的請求來到這個方法處理
    @RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
	public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
        //狀態(tài)碼
		HttpStatus status = getStatus(request);
        //從DefaultErrorAttributes里獲取可以在頁面顯示的數(shù)據(jù)
		Map<String, Object> model = Collections
				.unmodifiableMap(getErrorAttributes(request, getErrorAttributeOptions(request, MediaType.TEXT_HTML)));
		response.setStatus(status.value());
        //調(diào)用父類里的方法,尋找錯誤視圖解析器,來解析錯誤視圖
		ModelAndView modelAndView = resolveErrorView(request, response, status, model);
        //?。?!如果沒有配置具體的狀態(tài)碼錯誤頁面或4xx,5xx這種視圖,視圖解析不成功,就會返回空的ModelAndView對象。此時就會構(gòu)造一個默認(rèn)的error錯誤視圖,通過BeanNameViewResolver視圖解析器,根據(jù)視圖名(error)作為組件id去容器中找到View對象
		return (modelAndView != null) ? modelAndView : new ModelAndView("error", model);
	}
	
    //2、產(chǎn)生json數(shù)據(jù),其他客戶端來到這個方法處理
	@RequestMapping
	public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
		HttpStatus status = getStatus(request);
		if (status == HttpStatus.NO_CONTENT) {
			return new ResponseEntity<>(status);
		}
		Map<String, Object> body = getErrorAttributes(request, getErrorAttributeOptions(request, MediaType.ALL));
		return new ResponseEntity<>(body, status);
	}
}

========================AbstractErrorController================================
protected ModelAndView resolveErrorView(HttpServletRequest request,HttpServletResponse response, HttpStatus status, Map<String, Object> model) {
    
    for (ErrorViewResolver resolver : this.errorViewResolvers) {
        //錯誤視圖解析器獲取錯誤視圖,返回ModelAndView
        ModelAndView modelAndView = resolver.resolveErrorView(request, status, model);
        if (modelAndView != null) {
            return modelAndView;
        }
    }
    return null;
}

總結(jié)一下,BasicErrorController主要作用:

處理默認(rèn)/error 路徑的請求

調(diào)用DefaultErrorViewResolver進(jìn)行錯誤視圖解析,分為三種情況

1.模板引擎支持解析,就去 /templates/error/下尋找我們配置的 狀態(tài)碼錯誤頁面,例如404.html 或4xx.html。

2.模板引擎找不到這個錯誤頁面,就去靜態(tài)資源文件夾【/resources/、/static/、/public/、/META-INF/resources/】下的error文件夾下尋找狀態(tài)碼錯誤頁面。

3.靜態(tài)資源文件夾下也找不到,則new ModelAndView("error", model)構(gòu)造一個默認(rèn)的錯誤視圖【就是經(jīng)常見到的 Whitelabel Error Page】。該默認(rèn)的錯誤視圖在ErrorMvcAutoConfiguration里已經(jīng)注冊到容器里了,并且它在容器中的id就是error。后面就會通過BeanNameViewResolver視圖解析器,根據(jù)視圖邏輯 error,作為組件id去容器中就可以找到默認(rèn)的錯誤視圖。

=========================ErrorMvcAutoConfiguration========================================
protected static class WhitelabelErrorViewConfiguration {

		private final StaticView defaultErrorView = new StaticView();
		
    	//向容器種注冊默認(rèn)的錯誤視圖,id為error
		@Bean(name = "error")
		@ConditionalOnMissingBean(name = "error")
		public View defaultErrorView() {
			return this.defaultErrorView;
		}
}
//可以看到靜態(tài)內(nèi)部類StaticView,進(jìn)行視圖渲染的時候,構(gòu)造了我們經(jīng)??吹降哪J(rèn)錯誤頁面Whitelabel Error Page。
private static class StaticView implements View {

		@Override
		public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response)
				throws Exception {
			if (response.isCommitted()) {
				String message = getMessage(model);
				logger.error(message);
				return;
			}
			response.setContentType(TEXT_HTML_UTF8.toString());
			StringBuilder builder = new StringBuilder();
			Object timestamp = model.get("timestamp");
			Object message = model.get("message");
			Object trace = model.get("trace");
			if (response.getContentType() == null) {
				response.setContentType(getContentType());
			}
			builder.append("<html><body><h1>Whitelabel Error Page</h1>").append(
					"<p>This application has no explicit mapping for /error, so you are seeing this as a fallback.</p>")
					.append("<div id='created'>").append(timestamp).append("</div>")
					.append("<div>There was an unexpected error (type=").append(htmlEscape(model.get("error")))
					.append(", status=").append(htmlEscape(model.get("status"))).append(").</div>");
			if (message != null) {
				builder.append("<div>").append(htmlEscape(message)).append("</div>");
			}
			if (trace != null) {
				builder.append("<div style='white-space:pre-wrap;'>").append(htmlEscape(trace)).append("</div>");
			}
			builder.append("</body></html>");
			response.getWriter().append(builder.toString());
		}
}

接下來就是介紹 DefaultErrorViewResolver,主要就是進(jìn)行錯誤視圖解析。如果發(fā)生錯誤,就會以HTTP的狀態(tài)碼 作為視圖地址,找到真正的錯誤頁面。但是注意,首先是精確查找具體的錯誤狀態(tài)碼頁面,然后是按照4xx,5xx這種查找。

public class DefaultErrorViewResolver implements ErrorViewResolver, Ordered {
    
    private static final Map<Series, String> SERIES_VIEWS;
    static {
        Map<Series, String> views = new EnumMap<>(Series.class);
        views.put(Series.CLIENT_ERROR, "4xx");
        views.put(Series.SERVER_ERROR, "5xx");
        SERIES_VIEWS = Collections.unmodifiableMap(views);
    }

    //解析錯誤視圖,要去的錯誤頁面
    @Override
    public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {
        //先精確查找錯誤視圖
        ModelAndView modelAndView = resolve(String.valueOf(status.value()), model);
        //精確查找不到,則查找4xx,5xx這種類型的錯誤頁面
        if (modelAndView == null && SERIES_VIEWS.containsKey(status.series())) {
            modelAndView = resolve(SERIES_VIEWS.get(status.series()), model);
        }
        return modelAndView;
    }
    //真正解析 viewName是狀態(tài)碼
    private ModelAndView resolve(String viewName, Map<String, Object> model) {
     //?。。。∧J(rèn)SpringBoot可以去找到一個頁面  error/404,注意定制錯誤頁面要放在error文件夾下,如error/4xx.html
        String errorViewName = "error/" + viewName;

        //模板引擎可以解析這個頁面地址就用模板引擎解析
        TemplateAvailabilityProvider provider = this.templateAvailabilityProviders
            .getProvider(errorViewName, this.applicationContext);
        if (provider != null) {
            //模板引擎可用的情況下返回到errorViewName指定的視圖地址
            return new ModelAndView(errorViewName, model);
        }
        //模板引擎不可用,就在靜態(tài)資源文件夾下找errorViewName對應(yīng)的頁面   error/404.html
        return resolveResource(errorViewName, model);
    }
    //模板引擎不可用,就去靜態(tài)資源文件夾下尋找
    private ModelAndView resolveResource(String viewName, Map<String, Object> model) {
        //這里遍歷的是"classpath:/META-INF/resources/","classpath:/resources/", "classpath:/static/", "classpath:/public/"
        for (String location : this.resourceProperties.getStaticLocations()) {
            try {
                Resource resource = this.applicationContext.getResource(location);
                resource = resource.createRelative(viewName + ".html");
                if (resource.exists()) {
                    return new ModelAndView(new HtmlResourceView(resource), model);
                }
            }
            catch (Exception ex) {
            }
        }
        return null;
    }
} 

最后介紹DefaultErrorAttributes,里面存放了錯誤頁面能夠顯示的數(shù)據(jù)。比如狀態(tài)碼、錯誤提示、異常消息等。

public class DefaultErrorAttributes implements ErrorAttributes, HandlerExceptionResolver, Ordered {
    //幫我們在頁面共享信息
    @Override
        public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes,
                boolean includeStackTrace) {
            Map<String, Object> errorAttributes = new LinkedHashMap<String, Object>();
            errorAttributes.put("timestamp", new Date());
            addStatus(errorAttributes, requestAttributes);
            addErrorDetails(errorAttributes, requestAttributes, includeStackTrace);
            addPath(errorAttributes, requestAttributes);
            return errorAttributes;
        }
}

總結(jié):

  • 當(dāng)發(fā)生了異常,而且所有的處理器異常解析器都處理不了該異常,ErrorPageCustomizer就會生效(定制錯誤的響應(yīng)規(guī)則)。Tomcat就會發(fā)送/error請求,然后被HandlerMapping映射到BasicErrorController處理。
  • 解析錯誤視圖:前提是配置了4xx.html、5xx.html錯誤狀態(tài)碼頁面,去哪個狀態(tài)碼錯誤頁面就由DefaultErrorViewResolver解析得到。如果沒有配置錯誤狀態(tài)碼頁面,就是默認(rèn)的錯誤視圖StaticView,它是位于ErrorMvcAutoConfiguration里的一個靜態(tài)內(nèi)部類,被自動注冊到容器中。后面進(jìn)行視圖渲染的時候,就是StaticView里的render()方法構(gòu)造了我們經(jīng)??吹降哪J(rèn)錯誤頁面【W(wǎng)hitelabel Error Page】。
  • 提取數(shù)據(jù):頁面能夠獲取什么數(shù)據(jù)是由 DefaultErrorViewResolver設(shè)置的。

四、自定義異常處理

1、自定義異常處理頁

有模板引擎的情況下

  • 沒有模板引擎(模板引擎找不到這個錯誤頁面),靜態(tài)資源文件夾下找。依然要將錯誤頁面放在error文件夾下。
  • error/狀態(tài)碼.html,就是將錯誤頁面命名為狀態(tài)碼.html放在模板引擎文件夾里面的 error文件夾下;我們可以使用4xx5xx作為錯誤頁面的文件名來匹配這種類型的所有錯誤,不過優(yōu)先尋找精確的狀態(tài)碼.html
  • 以上都沒有找到錯誤頁面,就是默認(rèn)來到SpringBoot默認(rèn)的錯誤提示頁面。

錯誤頁面能獲取的信息DefaultErrorAttributes

  • timestamp:時間戳
  • status:狀態(tài)碼
  • error:錯誤提示
  • exception:異常對象
  • message:異常消息
  • errors:JSR303數(shù)據(jù)校驗(yàn)的錯誤都在這里

2、@ControllerAdvice+@ExceptionHandler處理全局異常

底層是由 ExceptionHandlerExceptionResolver處理器異常解析器支持的

3、@ResponseStatus+自定義異常

底層是由 ResponseStatusExceptionResolver處理器異常解析器支持的,但是它解析完成后,調(diào)用了 **response.sendError(statusCode, resolvedReason);**由tomcat發(fā)送的/error請求,進(jìn)入默認(rèn)異常處理機(jī)制。

Spring底層的異常

如 參數(shù)類型轉(zhuǎn)換異常;由DefaultHandlerExceptionResolver 處理器異常解析器支持的,處理框架底層的異常。但是它解析完成后,調(diào)用了 response.sendError(HttpServletResponse.SC_BAD_REQUEST, ex.getMessage()); 由tomcat發(fā)送的/error請求,進(jìn)入默認(rèn)處理機(jī)制。

擴(kuò)展:【可不看】

自定義處理器異常解析器、錯誤視圖解析器:

實(shí)現(xiàn) HandlerExceptionResolver接口自定義處理器異常解析器;可以作為默認(rèn)的全局異常處理規(guī)則

image.png

實(shí)現(xiàn)ErrorViewResolver自定義錯誤視圖解析器

到此這篇關(guān)于SpringBoot的異常處理流程是什么樣的?的文章就介紹到這了,更多相關(guān)SpringBoot異常處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot脫敏控件升級支持深度脫敏

    springboot脫敏控件升級支持深度脫敏

    這篇文章主要為大家介紹了springboot脫敏控件升級支持深度脫敏,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Maven下 mybatis-generator使用

    Maven下 mybatis-generator使用

    這篇文章主要介紹了Maven下 mybatis-generator使用 ,非常不錯,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-09-09
  • SpringBoot項(xiàng)目中JDK動態(tài)代理和CGLIB動態(tài)代理的使用詳解

    SpringBoot項(xiàng)目中JDK動態(tài)代理和CGLIB動態(tài)代理的使用詳解

    JDK動態(tài)代理和CGLIB動態(tài)代理都是SpringBoot中實(shí)現(xiàn)AOP的重要技術(shù),JDK動態(tài)代理通過反射生成代理類,適用于目標(biāo)類實(shí)現(xiàn)了接口的場景,性能較好,易用性高,但必須實(shí)現(xiàn)接口且不能代理final方法,CGLIB動態(tài)代理通過生成子類實(shí)現(xiàn)代理
    2025-03-03
  • SpringBoot中restTemplate請求存在亂碼問題的解決方法

    SpringBoot中restTemplate請求存在亂碼問題的解決方法

    這篇文章主要介紹了SpringBoot中restTemplate請求存在亂碼問題的解決方法,文中有相關(guān)的圖文和代碼示例供大家參考,對大家的解決問題有一定的幫助,需要的朋友可以參考下
    2024-11-11
  • Spring5.2.x 源碼本地環(huán)境搭建的方法步驟

    Spring5.2.x 源碼本地環(huán)境搭建的方法步驟

    這篇文章主要介紹了Spring5.2.x 源碼本地環(huán)境搭建的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java異常體系非正常停止和分類

    Java異常體系非正常停止和分類

    這篇文章主要介紹了Java異常體系非正常停止和分類,指的是程序在執(zhí)行過程中,出現(xiàn)的非正常的情況,最終會導(dǎo)致JVM的非正常停止更多相關(guān)內(nèi)容需要的朋友可以參考一下
    2022-06-06
  • Java集合中的Iterator迭代器接口詳解

    Java集合中的Iterator迭代器接口詳解

    這篇文章主要介紹了Java集合中的Iterator迭代器接口詳解,Iterator,被稱為迭代器接口,本身并不提供存儲對象的能力,主要用于遍歷Collection中的元素,需要的朋友可以參考下
    2023-11-11
  • java實(shí)現(xiàn)音頻轉(zhuǎn)文本的實(shí)現(xiàn)步驟

    java實(shí)現(xiàn)音頻轉(zhuǎn)文本的實(shí)現(xiàn)步驟

    本文主要介紹了java實(shí)現(xiàn)音頻轉(zhuǎn)文本的實(shí)現(xiàn)步驟,可以通過使用一些現(xiàn)成的庫或者API來實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • java中的hashCode方法小例子

    java中的hashCode方法小例子

    這篇文章主要介紹了java中的hashCode方法小例子,有需要的朋友可以參考一下
    2013-12-12
  • java線程池工作隊(duì)列飽和策略代碼示例

    java線程池工作隊(duì)列飽和策略代碼示例

    這篇文章主要介紹了java線程池工作隊(duì)列飽和策略代碼示例,涉及線程池的簡單介紹,工作隊(duì)列飽和策略的分析及代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11

最新評論

玉龙| 盱眙县| 平阴县| 乐山市| 建阳市| 平邑县| 太谷县| 青岛市| 新民市| 尼勒克县| 泰兴市| 尚志市| 浦江县| 宁蒗| 蓬溪县| 都兰县| 扶沟县| 西林县| 毕节市| 盐津县| 蒙自县| 彭州市| 华蓥市| 连平县| 鹿邑县| 卓尼县| 高陵县| 彰化市| 乐平市| 华安县| 长寿区| 嘉禾县| 微山县| 卓资县| 连南| 太白县| 土默特右旗| 仲巴县| 砚山县| 巴马| 涡阳县|